Бинарные уязвимости/Инструменты поиска бинарных уязвимостей: различия между версиями

Материал из SecSem Wiki
Перейти к навигации Перейти к поиску
(Примеры с занятия)
(gdb: info proc mappings)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 87: Строка 87:
 
</pre>
 
</pre>
  
== IDA Pro ==
+
== IDA ==
  
 
Интерактивный дизассемблер и декомпилятор.
 
Интерактивный дизассемблер и декомпилятор.
 +
 +
Версия IDA Free вполне подходит для наших задач, её можно [https://hex-rays.com/ida-free/ скачать с официального сайта]. Ссылки на скачивание могут не открываться из РФ, вот на всякий случай зеркала:
 +
 +
* https://course.secsem.ru/idafree83_linux.run
 +
* https://course.secsem.ru/idafree83_windows.exe
 +
* https://course.secsem.ru/idafree83_mac.app.zip
  
 
=== Шорткаты ===
 
=== Шорткаты ===
Строка 95: Строка 101:
 
{{клавиша|F5}}
 
{{клавиша|F5}}
 
</center>
 
</center>
==== IDA ====
+
==== Режим дизассемблера ====
 
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора
 
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора
 
* {{клавиша|F5}} — декомпилировать функцию
 
* {{клавиша|F5}} — декомпилировать функцию
Строка 105: Строка 111:
 
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку
 
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку
 
* {{клавиша|R}} — переопределить число в инструкции как строку (<code>mov rdx, 335F47414C465Fh</code> -> <code>mov rdx, '3_GALF_'</code>)
 
* {{клавиша|R}} — переопределить число в инструкции как строку (<code>mov rdx, 335F47414C465Fh</code> -> <code>mov rdx, '3_GALF_'</code>)
Неплохой [https://radare.gitbooks.io/radare2book/content/debugger/migration.html#shortcuts список] из доков по radare2.
 
  
==== Hex-Rays ====
+
==== Режим декомпилятора (Hex-Rays) ====
 
* {{клавиша|N}} — переименовать
 
* {{клавиша|N}} — переименовать
 
* {{клавиша|Y}} — поменять тип
 
* {{клавиша|Y}} — поменять тип
Строка 128: Строка 133:
 
* <code>x/10i $pc</code> - посмотреть несколько инструкций вперед.
 
* <code>x/10i $pc</code> - посмотреть несколько инструкций вперед.
 
* <code>layout asm</code> - переключиться в псевдографический режим с листингом ассемблерных команд.
 
* <code>layout asm</code> - переключиться в псевдографический режим с листингом ассемблерных команд.
 +
* <code>info proc mappings</code> - показать карту памяти процесса
  
 
== Примеры с занятия ==
 
== Примеры с занятия ==
  
Бинарники, которые были рассмотрены на семинаре: [[Media:2019 reverse examples.zip]].
+
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).

Текущая версия на 02:25, 2 ноября 2023

strings

Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.

$ strings reverse_example_1
/lib64/ld-linux-x86-64.so.2
libcrypto.so.1.0.0
_ITM_deregisterTMCloneTable
/lib64/ld-linux-x86-64.so.2
libcrypto.so.1.0.0
_ITM_deregisterTMCloneTable
__gmon_start__
_Jv_RegisterClasses
_ITM_registerTMCloneTable
MD5_Final
MD5_Init
MD5_Update
libc.so.6
fopen
__stack_chk_fail
fgets
malloc
stderr
fwrite
__sprintf_chk
__libc_start_main
free
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.2.5
OPENSSL_1.0.0
D$(1
T$(dH3
AUATH
D$h1
|$hdH3<%(
x[]A\A]
AWAVA
AUATL
[]A\A]A^A_
%02X
./cd-key.txt
failed to open CD key file
failed to read CD key file
invalid cdkey
Good job!
;*3$"
.shstrtab
.interp
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got.plt
.data
.bss

strace

Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).

$ strace ./reverse_example_1
...
openat(AT_FDCWD, "./cd-key.txt", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0
read(3, "AAAAA-BBBBB-CCCCC-DDDDD\n", 4096) = 24
write(2, "invalid cdkey\n", 14)         = 14
exit_group(1)                           = ?

IDA

Интерактивный дизассемблер и декомпилятор.

Версия IDA Free вполне подходит для наших задач, её можно скачать с официального сайта. Ссылки на скачивание могут не открываться из РФ, вот на всякий случай зеркала:

Шорткаты

F5

Режим дизассемблера

  • P — создать функцию, начиная с текущей позиции курсора
  • F5 — декомпилировать функцию
  • ↵ Enter — проследовать по курсору (например, перейти к функции или массиву)
  • Esc — назад (противоположность ↵ Enter)
  • X — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)
  • C — переопределить байты, начиная с курсора, как код.
  • D — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))
  • A — переопределить байты, начиная с курсора, как строку
  • R — переопределить число в инструкции как строку (mov rdx, 335F47414C465Fh -> mov rdx, '3_GALF_')

Режим декомпилятора (Hex-Rays)

  • N — переименовать
  • Y — поменять тип
    • Может показаться, что с помощью Y можно и переименовать, или с помощью N задать тип, однако это не так
  • ↵ Enter — проследовать по курсору
  • Esc — назад
  • Tab ↹ — перейти к данному месту из декомпилированного в дизассемблированный код и обратно

Полный список на официальном сайте.

gdb

С gdb можно познакомиться по любому туториалу в интернете.

Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:

  • b * 0x400155 - поставить брэйкпоинт на адрес.
  • p (char*)$rdi - напечатать как строку содержимое памяти, на которую указывает регистр rdi. См. также статью про соглашения вызовов на Википедии.
  • help x - почитать справку по команде x, которая очень полезна для изучения содержимого памяти.
  • x/10i $pc - посмотреть несколько инструкций вперед.
  • layout asm - переключиться в псевдографический режим с листингом ассемблерных команд.
  • info proc mappings - показать карту памяти процесса

Примеры с занятия

Бинарник, который были рассмотрен на семинаре: Media:2023 reverse examples.zip (плюс сорцы).