Я всегда был большим поклонником операционной системы BeOS. Некоторое время я использовал ее в качестве основной операционной системы, а также я фанат проекта Haiku, который является повторной реализацией BeOS с открытым исходным кодом.

В настоящее время я изучаю курс Penetration Testing with Kali Linux (PWK) и сертификацию OSCP. В руководстве по курсу есть пара глав о переполнении буфера и шелл-коде, которые заставили меня освежить свои очень ограниченные навыки сборки. А так как первая бета-версия Haiku была только что выпущена, я подумал, что попытка написать какой-нибудь ассемблер на Haiku будет забавным упражнением. Начал с х86 версии, так как не очень разбираюсь в х64 сборке. Я использовал образ x86 beta1, расположенный по адресу https://www.haiku-os.org/get-haiku/.

Погуглив, с чего начать, я нашел страницу на веб-сайте Haiku, описывающую системные вызовы Haiku с примером того, как написать простое приложение Hello, World на ассемблере.

Однако при попытке собрать и запустить пример он просто вылетел из-за segfault, и через некоторое время я узнал, что это было из-за того, что статья была старой, а фактические номера системных вызовов изменились. Файл с номерами системных вызовов, syscalls.S.inc, также не является частью исходного дерева Haiku, а создается при сборке системы.

Поэтому, чтобы получить правильные числа, мне пришлось загрузить исходный код хайку и либо запустить команду генерации отдельно, либо сгенерировать ее во время сборки операционной системы. Поковырявшись, я обнаружил, что файл был сгенерирован при сборке libroot, поэтому я сгенерировал файл с помощью следующих команд:

git clone https://git.haiku-os.org/haiku
cd haiku
./configure --target-arch x86_gcc2 --target-arch x86
cd src/system/libroot
jam

После запуска этой команды я нашел сгенерированный файл в generated/objects/haiku/x86_gcc2/common/system/libroot/os/syscalls.S.inc в исходном коде хайку. каталог. Я также загрузил его в GitHub gist, но цифры могут меняться, поэтому, чтобы быть уверенным, что у вас правильные цифры, лучше сгенерировать их самостоятельно.

Глядя на файл, я увидел, что правильные номера системных вызовов были 144 для системного вызова записи и 38 для выходной системный вызов. Затем я изменил числа в коде примера, собрал и связал и получил следующий результат:

Готовый hello_haiku.asm

Чтобы получить 64-битную версию Haiku x86_64, перейдите сюда.