【发布时间】:2021-01-14 11:45:14
【问题描述】:
我一直在尝试将这个 C 程序编译为汇编,但它没有正常工作。
我正在阅读 Dennis Yurichev 初学者的逆向工程,但我没有得到相同的输出。它是一个简单的 hello world 语句。我正在尝试获得 32 位输出
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
这就是书中所说的输出应该是什么
main proc near
var_10 = dword ptr -10h
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 10h
mov eax, offset aHelloWorld ; "hello, world\n"
mov [esp+10h+var_10], eax
call _printf
mov eax, 0
leave
retn
main endp
这里是步骤;
-
将print语句编译成32bit(我目前运行的是64bit pc)
gcc -m32 hello_world.c -o hello_world
-
使用gdb反汇编
- gdb 文件
- 设置拆解风格的intel
- 设置架构 i386:intel 反汇编主程序
我明白了;
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ebx
push ecx
call 0x565561d5 <__x86.get_pc_thunk.ax>
add eax,0x2e53
sub esp,0xc
lea edx,[eax-0x1ff8]
push edx
mov ebx,eax
call 0x56556030 <puts@plt>
add esp,0x10
mov eax,0x0
lea esp,[ebp-0x8]
pop ecx
pop ebx
pop ebp
lea esp,[ecx-0x4]
ret
我也用过
objdump -D -M i386,intel hello_world> hello_world.txt
ndisasm -b32 hello_world > hello_world.txt
但这些都不起作用。我只是不知道出了什么问题。我需要帮助。看着你彼得·科德斯 ^^
【问题讨论】:
-
为什么您希望您的编译器产生与其他人(不同)编译器相同的输出?
-
@EOF 实际上 gcc 给出了该代码
-
您是否在与作者相同的操作系统上使用相同版本的相同编译器、相同的优化标志?如果有任何不同,即使是编译器版本,那么您的结果也不会完全匹配。
-
编译器从输入语言以输出语言创建功能等效的代码。没有理由期望任何两个或相同的选项具有不同的选项(或者与 gcc 一样,即使相同版本也是如此)产生完全相同的输出。为了理解这本书,只需阅读本书并使用书中的任何内容。
-
感谢您的回复。我知道会有一些差异,因为编译器不同,但我没想到会有那么多。添加了更多说明。我也完全忘记了优化。我仍然希望至少能看到字符串,但什么也没有……
标签: c assembly gcc x86 objdump