2016-03-12 11 views
0

Я вернулся - благодаря добрым людям здесь, особенно @Jester и @PeterCordes, у меня есть три из четырех моих целевых платформ. У меня Win 32 и Win 64 работают, и у меня OS X 64 работает, но я не могу заставить работать сборку OS X в 32-битной библиотеке libc.os x 32-bit printf от ассемблера

Я могу сделать «мир привет» и другие вещи, используя syscall (64-разрядный) и int 0x80 (32-разрядный), и я могу сделать работу _printf в 64-битной, но мне не удаётся сделать он работает в 32-битном режиме.

В теории мне нужно нажать параметры в стек, а затем по 16 байт выровнять стек, но я получаю ошибку сегментации: 11 ошибка при запуске кода.

8 section .data 
9 
10 hello db "Hello, world", 0x0a, 0x00 
11 
12 section .text 
13 
14 global _main 
15 extern _printf, _exit 
16 
17 _main: 
18  push hello 
19  sub esp, 12  ; 16-byte align stack 
20  call _printf 
21 
22  add esp, 16  ; undo stack alignment 
23  push 0 
24  sub esp, 12  ; 16-byte align stack 
25  call _exit 

Я пробовал его без кода выравнивания стека, и я получаю ту же ошибку. Я нашел различные образцы онлайн, и я не мог заставить их работать, и я даже сделал трюк с использованием GCC для вывода ассемблера Intel-синтаксиса, и я не смог перевести его в nasm.

Я использую nasm, потому что он работает на Windows, OS X и Linux, поэтому мне нужно только изучить один синтаксис ассемблера.

Я понимаю, что все компьютеры Intel 64-разрядные, но они могут запускать 32-разрядный код, поэтому я хочу быть в состоянии следить за ним и понимать его. Все это направлено на то, чтобы помочь мне перепрограммировать вредоносное ПО.

Благодарность

+0

у Вас возникли проблемы перевода 'Gcc -masm = intel' выхода в NASM? Это странно; это очень похоже на MASM, так что это в основном то же самое, за исключением того, что вместо DWORD они записывают 'DWORD PTR'. Вы всегда можете просто использовать дизассемблер, который выводит правильный синтаксис nasm, например. Превосходный дизассемблер «objconv» Агнера Фога. –

ответ

0

функция всегда ищет свои аргументы прямо над обратным адресом. Если вы sub esp, 12 после нажатия чего-то, args включают 12 байт мусора.

sub esp, 12  ; 16-byte align stack 
push hello 
call _printf 

mov [esp], 0 ; defer popping the stack 
call _exit 
;add esp, 16  ; exit doesn't return 


section .rodata  ; You don't need to write this string, so put it in rodata 

hello db "Hello, world", 0x0a, 0x00 

все Intel Macs являются 64-разрядными

Не совсем верно: самым первым Маковы поколения Intel использовал Intel Core процессоры (в основном Pentium-M), не Core2. Если бы они ждали одного поколения, им никогда не понадобилось бы много заботиться о 32-битной.

Хотя в данный момент, я полагаю, это считается безопасным распространять бинарные файлы, которые не работают на 32-битном только OS X.

+0

Привет, Питер. Это имеет смысл в отношении стека - я думал, что это выглядит странно, а самое худшее - это то, что я видел на некоторых веб-сайтах, якобы объясняющих, как это сделать. Я предполагаю, что я запутал связь сейчас, потому что он собирает, но генерирует ошибку сегментации: 11. – querist

+0

@querist: используйте команду 'file', чтобы убедиться, что это 32-битный двоичный файл. Или используйте ссылку 'gcc -m32 hello.o' для связи. Посмотрите на вывод 'objdump -d -Mintel' или любой другой дизассемблер, который вам нравится, чтобы узнать, что произошло с вашим двоичным файлом. Или еще лучше, запустите его под gdb. Использование отладчика имеет важное значение для обучения asm. (gdb имеет режим синтаксиса intel. put 'set disassembly-flavor intel' в вашем' ~/.gdbinit') –

+0

Это 32-разрядный исполняемый файл в порядке. Я получаю предупреждение об абсолютной адресации в _main: ld: warning: PIE отключен. Абсолютная адресация (возможно, -mdynamic-no-pic) не разрешена в коде, подписанном PIE, но используется в _main из hello32x.o.Чтобы исправить это предупреждение, не компилируйте с помощью -mdynamic-no-pic или ссылки с -Wl, -no_pie По-прежнему возникает ошибка сегментации. Я не ожидал, что это будет сложно сделать в 32-битном режиме с libc. – querist