Это четвертая статья Инструменты и базовый обратный инжиниринг, подготовленная 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

Спасибо за внимание! Если вам понравилась эта история, пожалуйста, нажмите кнопку 👏 и поделитесь, чтобы помочь другим! Не стесняйтесь оставлять комментарии 💬 ниже. Есть отзывы? Давайте подключимся к Твиттеру.

❤️ от inc0gnito