1) начинающих реверсеров, знающих особенности обратного проектирования, и желающих изучить такой отладчик как GDB
2) как подсказка тем кто постоянно работает с IDA, Ghidra или любым другим мощным и надежным инструментом, но в силу тех или иных обстоятельств решить задачу проще и быстрее с помощью GDB, и не очень хочется залезать в официальную документацию и снова все вспоминать
Общий синтаксис выбора исполняемого файла для анализа
gdb program_name
Запустить выполнение программы
run | r
Присоединиться к gdbserver
target remote host:port
Присоединиться к процессу, отключиться от него
attach PID / detach
Выйти из gdb
quit | q
CTRL + D
Выбрать синтаксис ассемблера
set disassembly-flavor intel/att
Просмотреть информацию об архитектуре, секциях
info file
Получение списка функций
info functions | i func
Получение asm-листинга функции
disas func_name
disas address
Если у вас есть исходники (можем собрать с опцией -g3 для gcc) или исследуемая программа содержит отладочную информацию, можем посмотреть листинг ее исходного кода
list func_name
Установить аргументы для каждого запуска программы и посмотреть их
set args
show args
Распределение виртуальной памяти
info proc mappings
Просмотр регистров
registers
Шаг с заходом в функцию
step | s
Шаг с прыжком через вызываемую подпрограмму
next | n
Выполнить до нужной строки, адреса
until | u number_of_list_string
until | u *func_name+offset
until | u *address
Информация об аргументах функции, локальных переменных (для файлов, содержащих отладочную информацию) и фрейме текущей функции
info args
info locals
info frame
Просмотреть список процессов и выбрать интересующий
info threads
thread number
Способы расстановки breakpoints
b func_name
b *func_name+offset
b *address
Посмотреть список точек останова, включить или отключить, удалить breakpoint
info break
disable/enable breakpoint_number
delete breakpoint_number
ignore breakpoint_number n // остановится на этой точке пройдя ее n раз
Продолжить выполнение до следующего breakpoint-а
continue | c
Просмотр стека
telescope
telescope $rsp+64
Для отображения значения по указанному адресу используется команда x, где через “/” указывается формат вывода
x/i - инструкция
x/x - hex
x/s - строка
x/a - адрес
а также размер вывода
x/b - 8-bit
x/h - 16-bit
x/w - 32-bit
x/g - 64-bit
Пример
x/64bx
x/i $pc
Передача аргумента командной строки
run $(python -c "print('A'*32 + 'xdexad')")
run $(echo "asdf\xdexad")
Для передачи значений функциям ввода
run <<< $(python -c "print('A1'*3)")
run <<< $(echo "asdfxdexad")
Запустить сервер gdb для отладки
gdbserver host:port program
Все мы проходили через этот неловкий момент когда во время отладки мы проскочили интересующую нас функцию, и теперь снова надо перезапускать отладчик, проходить тот же путь на CFG и т.п. Чтобы избежать этого, в gdb есть такая фишка как Reverse Debug, позволяющая сохранить состояние программы и обратно отладить до него.
Для этого, после запуска отладчика укажем gdb, что хотим начать использовать reverse debug и стоит сохранять состояния программы
record
После этого станут доступны следующие команды
reverse-step
reverse-next
Сдампить участок памяти ( часто необходимо при работе с распаковщиками )
dump memory output_file start_addr end_addr
Для того чтобы закрепить вывод команды, скажем просмотр инструкций во время отладки и отображения регистров можно воспользоваться командой display
display/5i $pc
display/g $rax
display/g $rbx
display/g $rcx
Для эффективного использования gdb лучше воспользоваться плагином gef, он уже включает в себя удобный закрепленный вывод, используемый при динамическом анализе, а также набор собственных команд расширяющий возможности нашего универсального отладчика. Рассмотрим некоторые наиболее полезные.
Посмотреть состояние aslr, включить/отключить
aslr
aslr on/off
Для проверки исполняемого файла на наличие ASLR, Canary, PIE и т.д.
checksec
Посмотреть чанки
heap chunks
Находясь в функции можем получить значение канарейки и адрес, где она расположена
canary
Чуть более удобный вывод, чем info proc mappings
vmmap
Просмотр регистра флагов и изменение их
flags
flags -Flag_name +Flag_name
Помощь для поиска уязвимостей форматной строки (установка на них точек останова, информация по найденным функциям)
format-string-helper
Создание паттерна и его поиск
pattern create 128
pattern search 0x61616167
pattern search $rbp
Поиск строк по шаблону
search-pattern pattern
Патчинг
patch byte/word/dword/qword address value
Печать массива в формате удобном для копирования в python код. Параметр b должен быть 8/16/32/64, l контролирует длину массива
Пример
print-format -b 64 -l 1 $rsp
Для поиска шеллкода по шаблону
shellcode search pattern
shellcode get shellcode_number
Ксорим значения в памяти и регистрах
xor display address/register size xor_key
xor patch address/register size xor_key
Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…
Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…
Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…
У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…
24 апреля 2024 года в Москве состоялась церемония вручения наград международного конкурса Workspace Digital Awards. В этом году участниками стали…
27 июня Яндекс проведет гик-фестиваль Young Con для студентов и молодых специалистов, которые интересуются технологиями и хотят работать в IT.…