Дебаг на Silicon

34d7e5406f01fe9ca459a1580e8b3cd9

Предыстория

Я, как обладатель яблочного ноута, игрок в CTF и бинарщик, решил динамически проанализировать программу и был очень удивлён, когда не обнаружил привычного для меня GDB. В итоге, немного погуглив, я нашёл для себя решение проблемы и решил его описать.

Что ж будем делать?

  • Поставим Rosetta, чтобы можно было компилировать под x86_64.

  • Установим pwndbg-lldb для отладки Mach-O программ.

  • Установим pwndbg для отладки ELF-файлов.

  • Подведем итоги

Rosetta

Сначала надо скачать Rosetta. Это делается через softwareupdate. Потом запустимся от другой архитектуры.

  1. Установим Rosetta 2:

/usr/sbin/softwareupdate --install-rosetta --agree-to-license

2. Откроем новое окно Terminal в режиме x86_64:

arch -x86_64 /bin/bash

Важно отметить, что arch -x86_64  — это просто выполнение различных команд в данной архитектуре, например, вызов bash. Если вы используете какую-либо другую оболочку, такую как zsh, просто укажите путь до неё.

Пример:

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 файлы этих же архитектур соответственно.

© Habrahabr.ru