Введение в практическую безопасность (2019)/Реверс-инжиниринг: различия между версиями
WGH (обсуждение | вклад) Новая страница: «== strings == Выводит константные строки, которые есть в бинарнике. Строки определяются эврис…» |
WGH (обсуждение | вклад) раздел про gdb |
||
| (не показана 1 промежуточная версия этого же участника) | |||
| Строка 116: | Строка 116: | ||
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте. | [https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте. | ||
== gdb == | |||
С '''gdb''' можно познакомиться по любому туториалу в интернете. | |||
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды: | |||
* <code>b * 0x400155</code> - поставить брэйкпоинт на адрес. | |||
* <code>p (char*)$rdi</code> - напечатать как строку содержимое памяти, на которую указывает регистр <code>rdi</code>. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии]. | |||
* <code>help x</code> - почитать справку по команде <code>x</code>, которая очень полезна для изучения содержимого памяти. | |||
* <code>x/10i $pc</code> - посмотреть несколько инструкций вперед. | |||
* <code>layout asm</code> - переключиться в псевдографический режим с листингом ассемблерных команд. | |||
== Примеры с занятия == | == Примеры с занятия == | ||
| Строка 122: | Строка 134: | ||
Исходник первого примера: [[Media:2019 reverse example 1.c]] | Исходник первого примера: [[Media:2019 reverse example 1.c]] | ||
Пример валидного ключа: <code>AAAAA-BBBBB-CCCCC-B334C | |||
</code> | |||
Алгоритм проверки ключа на Python: | Алгоритм проверки ключа на Python: | ||
Текущая версия от 18:22, 13 марта 2019
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 Pro
Интерактивный дизассемблер и декомпилятор.
Шорткаты
F5
IDA
- P — создать функцию, начиная с текущей позиции курсора
- F5 — декомпилировать функцию
- ↵ Enter — проследовать по курсору (например, перейти к функции или массиву)
- Esc — назад (противоположность ↵ Enter)
- X — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)
- C — переопределить байты, начиная с курсора, как код.
- D — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))
- A — переопределить байты, начиная с курсора, как строку
- R — переопределить число в инструкции как строку (
mov rdx, 335F47414C465Fh->mov rdx, '3_GALF_')
Неплохой список из доков по radare2.
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- переключиться в псевдографический режим с листингом ассемблерных команд.
Примеры с занятия
Бинарники, которые были рассмотрены на семинаре: Media:2019 reverse examples.zip.
Исходник первого примера: Media:2019 reverse example 1.c
Пример валидного ключа: AAAAA-BBBBB-CCCCC-B334C
Алгоритм проверки ключа на Python:
import string
import hashlib
def validate_key(s):
if len(s) != 23:
return False
for i, c in enumerate(s):
if i in (5, 11, 17):
if c != '-':
return False
else:
if c not in (string.ascii_uppercase + string.digits):
return False
m = hashlib.md5()
m.update(s[:17].encode('ascii'))
m.update(bytes([0x4d,0x67,0xde,0xb9,0x60,0xce,0x38,0x30,0xe1,0xb7,0x40,0xe5,0xeb,0x39,0xe0,0x15]))
return s[18:] == m.hexdigest()[:5].upper()