【发布时间】:2015-01-13 01:18:55
【问题描述】:
在这个方法中
void lame(void) {
char small[30];
gets(small);
printf("%s\n",small);
}
我希望堆栈增加 0x20
但 gdb 显示它增加了 0x38
0x08048450 <+3>: sub $0x38, %esp
我不太确定需要什么信息来回答这个问题,所以如果我遗漏了什么,请告诉我,我会补充:
- Ubuntu 140.04 32 位
- 编译命令:cc -ggdb -fno-stack-protector blah.c -o blah
- CC --version - 4.8.2
- 在 Oracle Virtual Box 4.3.20 中运行
我在做什么 只是想玩弄缓冲区溢出并找到我正在关注的this 示例
disas lame
【问题讨论】:
-
您忘记启用优化。传出参数也可以直接从堆栈中分配,然后对齐。
-
@Jester 谢谢,我尝试使用 3 个不同的选项 -O、-O1、-O2 重新编译,它们都产生相同的程序集
-
"gdb 显示它增加了 0x38":相对于 what 增加了?一个空函数?
-
堆栈指针必须保持 16 字节对齐,以便留下
0x28或0x38的可能性(push %ebx使用 4 个字节,call使用另外 4 个字节,这就是8的来源)。您的缓冲区四舍五入到0x20,我们需要额外的 4 个字节用于传出参数。不清楚为什么 0x28 不起作用。 -
@Jester,16 字节对齐是针对 x64 的,不是吗? asm 中似乎没有任何内容表明 64 位(例如使用 rax)并且 OP 声明它是 Ubuntu 32 位。