Main
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 30h
mov dword ptr [esp], 8 ; size
call _malloc
mov [esp+2Ch], eax
mov dword ptr [esp+4], 4
mov eax, [esp+2Ch]
mov [esp], eax
call __start
__start
arg_0= dword ptr 8
arg_4= dword ptr 0Ch
push ebp
mov ebp, esp
mov eax, [ebp+arg_4]
mov edx, eax
sar edx, 1Fh
shr edx, 1Eh
add eax, edx
and eax, 3
sub eax, edx
mov [ebp+arg_4], eax
mov eax, [ebp+arg_4]
cmp eax, 1
jz short loc_80489F0
上面的代码代表了我正在处理的项目的一部分,我需要将此程序集反向工程为相应的C代码。我相信我将main()放在堆栈上,其中[esp]包含指向malloc的指针,[esp + 4]包含数字4。
我在确定哪个arg包含时遇到了一些困难,我假设arg_0包含4,但是arg_4让我被抛弃了。
arg_0和arg_4是指什么?
谢谢!
答案 0 :(得分:2)
将定义视为C中的#define arg_0 8
和#define arg_4 0xc
。它们由编译器发出,以可读方式将参数的符号名称连接到堆栈上的偏移量。在这种情况下, arg_4
从基指针开始为正12。在这个调用约定(看起来像Microsoft)中,基指针ebp
指向前一个基指针,它位于返回地址之下。相对于ebp
,参数处于正偏移量,而局部(自动)变量处于负偏移量。
编译器已在Main
中应用了一个优化,以便为malloc
和_start
的两次调用构建堆栈帧,其中一个设置为esp
。要查看发生了什么,请绘制由sub esp, 30h
指令分配的堆栈的48个字节的图片,并仔细跟踪每个指令。真相将会消失。