看看这段代码我已经拆解了c程序的一个简单部分,用32位模式的gcc编译。 如您所见,编译器在ESP上减去8,然后减去0xC。推送在ESP上减去4个字节。因此,在printf调用之前,我们在堆栈上分配了24个字节。
0x0804846e <+3>: sub esp,0x8
0x08048471 <+6>: sub esp,0xc
0x08048474 <+9>: push 0x8048550
0x08048479 <+14>: call 0x8048330 <printf@plt>
0x0804847e <+19>: add esp,0x10
但是,如果你看看printf调用,编译器只会增加16个字节。所以我认为有泄漏?
如果我想在汇编程序中自己写,我会写:
0x08048474 <+9>: push 0x8048550
0x08048479 <+14>: call 0x8048330 <printf@plt>
0x0804847e <+19>: add esp,0x4
你认为我错了吗?如果没有局部变量,用sub esp在堆栈上分配数据的目的是什么?
答案 0 :(得分:1)
如果没有局部变量,使用sub esp在堆栈上分配数据的目的是什么?
通常它是堆栈对齐:GCC不知道被调用例程是否使用需要对齐的SSE2指令,因此它将堆栈对齐到例程中的16个字节。
我认为有泄漏
最有可能没有。但是你没有展示整个反汇编,所以不可能说出来。