我用c语言编写了非常简单的程序如下:
include<stdio.h>
#include<string.h>
main(int argc,char **argv)
{
char buffer[80];
getchar();
strcpy(buffer,argv[1]);
return 1;
}当我拆开它时,它看起来如下所示:
0x08048414 <+0>: push %ebp
0x08048415 <+1>: mov %esp,%ebp
0x08048417 <+3>: sub $0x58,%esp
0x0804841a <+6>: call 0x8048320 <getchar@plt>
0x0804841f <+11>: mov 0xc(%ebp),%eax
0x08048422 <+14>: add $0x4,%eax
0x08048425 <+17>: mov (%eax),%eax
0x08048427 <+19>: mov %eax,0x4(%esp)
0x0804842b <+23>: lea -0x50(%ebp),%eax
0x0804842e <+26>: mov %eax,(%esp)
0x08048431 <+29>: call 0x8048330 <strcpy@plt>
0x08048436 <+34>: mov $0x1,%eax
0x0804843b <+39>: leave
0x0804843c <+40>: ret我的问题是为什么它低于0x58从%,特别是,而不是0X50美元?我以80 "A“作为参数运行程序,这是一个接一个的堆栈(缓冲器,argv1)的结果;
x/24xw $esp
0xbffff290: 0xbffff298 0xbffff51e 0x41414141 0x41414141
0xbffff2a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2b0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2c0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2d0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff2e0: 0x41414141 0x41414141 0x00000000 0xb7e3f4d3发布于 2015-02-14 22:40:40
额外的8个字节用于strcpy的参数。由于某些原因,编译器选择在堆栈中预分配它们,并使用esp作为索引寄存器直接存储它们的值,而不是使用通常使用的push指令。
因此,如果指令mov %eax,0x4(%esp)被push %eax替换,指令mov %eax,(%esp)也被push %eax替换,编译器可以在堆栈上只分配80字节。
https://stackoverflow.com/questions/28520003
复制相似问题