Это четвертая статья Инструменты и базовый обратный инжиниринг, подготовленная RPISEC, являющейся подразделом курса Современная эксплуатация двоичных файлов.
Ссылка лекций: - http://security.cs.rpi.edu/courses/binexp-spring2015/
Все лекционные материалы и другие необходимые файлы доступны по указанной выше ссылке для ознакомления.
⬅️ Предыдущая запись __________________________________ Следующая запись
трещина
$ ./crackme0x02
Сбор информации с помощью инструмента rabin2.
rabin2 -I crackme0x02
Взлом с помощью radare2
radare2 crackme0x02 [0x08048330]> aaa [0x08048330]> pdf @ main
- аа: - проанализировать все.
- aaa: - проанализировать все с дополнительной информацией.
- pdf: - функция распечатки и разборки.
[0x08048330]> dr
dr: - печатает регистр данных со значениями.
Он показывает eax с «0», что неправильно, он должен содержать какое-то значение. radare2 анализирует двоичный файл в статическом режиме, поэтому мы должны использовать режим отладки radare2, чтобы мы могли установить точку останова между программой и узнать больше.
Взлом с использованием режима отладки radare2
$radare2 -d crackme0x02
- аа: - проанализировать все.
- aaa: - проанализировать все с дополнительной информацией.
- pdf: - функция распечатки и разборки.
По адресу «0x0804844e» есть инструкция cmp, поэтому давайте установим там точку останова.
- db flag: - поместите точку останова на flag, где flag может быть адресом или функцией имя.
- dc: - запустить программу.
cmp eax, dword [local_ch], Теперь давайте попробуем узнать значение регистра $ eax и local_0xc.
Нахождение значения eax.
[0x0804844e]> ? eax
Есть еще один способ получить значение регистра eax.
[0x0804844e]> dr eax [0x0804844e]> ? 0x00000539
- dr flag: - печатает значение регистра данных.
Нахождение значения local_ch.
[0x0804844e]> afvd local_ch [0x0804844e]> pxr $w @ebp-0xc [0x0804844e]> ? 0x00052b24
- afvd: - команда afvd name output r2 для отображения значения args / locals в отладчике.
Другой способ найти значение local_ch.
[0x0804844e]> afvd [0x0804844e]> ? 0x00052b24
- afvd: - команда afvd name output r2 для отображения значения args / locals в отладчике.
Взлом с использованием GDB
$gdb crackme0x02 gdb-peda$ disassemble main
gdb-peda$ break *0x0804844e
cmp eax, DWORD PTR [ebp-0xc]
- eax: - регистр eax содержит 0x539, 0x показывает, что он шестнадцатеричный.
- DWORD: - Это двойное слово, двойное слово - 32 бита или 4 байта (8 бит = 1 байт).
- PTR: - сокращение от Pointer.
- ebp-0xc: - 0xc (12 в десятичной системе) вычитается из ebp (базовый указатель).
Таким образом, в этой инструкции eax сравнивается с словом (числом), которое хранится по адресу ebp-0xc.
Давайте выясним, что хранится в eax и ebp-0xc.
На изображении выше eax показывает значение 0x539.
p/d 0x539
- p: - команда печати (сокращенно p).
- d: - Вывести как целое число в десятичной системе счисления со знаком.
1337 хранится в поле $ eax, которое мы указываем в качестве входных данных.
gdb-peda$ x/x $ebp-0xc 0xffffd1ec: 0x00052b24 gdb-peda$ p/d 0x00052b24 $9 = 338724
Команда x используется для e X амина.
- / x: - печатает адрес $ ebp и содержимое этого адреса в шестнадцатеричном формате.
Команда p используется для печати.
- / d: - печатать содержимое в виде десятичной дроби.
$./crackme0x02
Преобразование ‘0x00052b24’ с использованием python
python -c "print 0x00052b24"
Преобразование ‘0x00052b24’ с помощью rax2
rax2 0x00052b24
Спасибо за внимание! Если вам понравилась эта история, пожалуйста, нажмите кнопку 👏 и поделитесь, чтобы помочь другим! Не стесняйтесь оставлять комментарии 💬 ниже. Есть отзывы? Давайте подключимся к Твиттеру.