Дебаг на Silicon
Предыстория
Я, как обладатель яблочного ноута, игрок в CTF и бинарщик, решил динамически проанализировать программу и был очень удивлён, когда не обнаружил привычного для меня GDB. В итоге, немного погуглив, я нашёл для себя решение проблемы и решил его описать.
Что ж будем делать?
Поставим Rosetta, чтобы можно было компилировать под x86_64.
Установим pwndbg-lldb для отладки Mach-O программ.
Установим pwndbg для отладки ELF-файлов.
Подведем итоги
Rosetta
Сначала надо скачать Rosetta. Это делается через softwareupdate. Потом запустимся от другой архитектуры.
Установим Rosetta 2:
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
2. Откроем новое окно Terminal в режиме x86_64:
arch -x86_64 /bin/bash
Важно отметить, что arch -x86_64
Пример:
uname -a
Darwin MacBook-Air-3.local 24.1.0 Darwin Kernel Version 24.1.0: Thu Oct 10 21:02:26 ```PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T8122 arm64
Как можно заметить, сейчас у меня архитектура arm64, но, прописав эту команду:
arch -x86_64 /bin/bash
мы поменяли архитектуру на x86_64.
Проверим:
uname -a
Darwin MacBook-Air-3.local 24.1.0 Darwin Kernel Version 24.1.0: Thu Oct 10 21:02:26 PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T8122 x86_64
Теперь, когда мы на x86_64, можно делать то же самое, что и на обычных компьютерах с данной архитектурой. Давайте соберём программу на C под новой архитектурой:
cat >> main.c
#include
int main(){
printf("Hello, world!");
return 0;
}
gcc main.c -o main
file main
main: Mach-O 64-bit executable x86_64
./main
Hello, world!
Теперь, когда мы можем работать с иными архитектурами, можно заняться и отладчиками.
PWNDBG-LLDB
На самом деле, вся инструкция доступна на сайте. Я продублирую её, а также покажу, как установить nix и команду, через которую ставил pwndbg-lldb.
Сначала нужно поставить nix (package manager). Для этого можно либо перейти на сайт и скопировать оттуда, либо воспользоваться командой из статьи:
sh <(curl -L https://nixos.org/nix/install)
После этого нужно перезапустить терминал.
Далее через nix ставим pwndbg:
nix shell github:pwndbg/pwndbg#pwndbg-lldb --extra-experimental-features nix-command '--extra-experimental-features flakes
У меня установилось через такую команду. После установки можно пользоваться pwndbg-lldb как обычным отладчиком.
Пример: можете попробовать форматную строку:
#include
void vulnerable_function() {
char input[100];
printf("Введите строку: ");
gets(input);
printf(input);
}
int main() {
vulnerable_function();
return 0;
}
Cheatsheet по компиляции:
gcc .c -o -g
-g — оставить отладочную информацию.
-o — указать имя выходного файла
Далее в терминале запускаем pwndbg-lldb как обычный pwndbg:
pwndbg-lldb ./
pwndbg-lldb> breakpoint set -n
pwndbg-lldb> run
// дальше как в gdb, разберетесь :D
Теперь самая вкусная часть — pwndbg на arm64 xD.
PWNDBG-GDB
По схеме всё то же: скачать через nix и запустить, но со своими приколами.
nix shell github:pwndbg/pwndbg --extra-experimental-features nix-command --extra-experimental-features flakes
Всё, pwndbg установлен, но debug недоступен. Почему? Потому что у тебя Mac xD. Что же делать? Выход есть — это qemu.
Для установки qemu я буду использовать Orbstack. У них описано, как именно можно поставить qemu-static-user (user-space’s VM):
sudo apt install qemu-user-static
qemu-x86_64-static -g 1234 ./hello
В другом терминале:
pwngdb ./hello
target remote :1234
continue
Без виртуальной машины, к сожалению, дебажить ELF-файлы на Mac вообще без вариантов. exec format error будет вашим лучшим другом. Поэтому всё же придётся дебажить через qemu: либо через Orbstack, либо поставить на систему, либо через UTM. Но самое простое — это через Orbstack.
Итого
Мы смогли поставить два основных отладчика на macOS. Теперь можно дебажить программы для x86_64, arm и Mach-O файлы этих же архитектур соответственно.