【发布时间】:2016-06-28 01:21:36
【问题描述】:
我又回来了 - 感谢这里的好心人,尤其是 @Jester 和 @PeterCordes,我的四个目标平台中有三个正在运行。我有 Win 32 和 Win 64 工作,我有 OS X 64 工作,但我似乎无法使用 libc 库使 OS X 程序集在 32 位中工作。
我可以使用系统调用(64 位)和 int 0x80(32 位)做一个“hello world”和其他事情,我可以让 _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 Mac 都是 64 位的,但它们可以运行 32 位代码,所以我希望能够遵循并理解它。这一切都是为了帮助我对恶意软件进行逆向工程。
谢谢
【问题讨论】:
-
您在将
gcc -masm=intel输出转换为 NASM 时遇到问题?这很奇怪;它很像 MASM,所以除了写DWORD PTR而不是DWORD之外基本相同。您总是可以只使用输出正确 nasm 语法的反汇编程序,例如Agner Fog 的优秀objconv反汇编程序。
标签: macos assembly x86 32-bit libc