【发布时间】:2014-07-10 11:51:32
【问题描述】:
以下代码包含一个 8 字节的缓冲区。
void vuln() {
char buffer[8];
gets(buffer);
printf("%s",buffer);
}
int main() {
vuln();
return 0;
}
因此,预计只有 8 字节的堆栈会被保留给这个缓冲区。但是反汇编显示保留了 16 个字节。
(gdb)
Dump of assembler code for function vuln:
0x000000000040057d <+0>: push %rbp
0x000000000040057e <+1>: mov %rsp,%rbp
0x0000000000400581 <+4>: sub $0x10,%rsp
0x0000000000400585 <+8>: lea -0x10(%rbp),%rax
0x0000000000400589 <+12>: mov %rax,%rdi
0x000000000040058c <+15>: callq 0x400480 <gets@plt>
0x0000000000400591 <+20>: lea -0x10(%rbp),%rax
0x0000000000400595 <+24>: mov %rax,%rsi
0x0000000000400598 <+27>: mov $0x400644,%edi
0x000000000040059d <+32>: mov $0x0,%eax
0x00000000004005a2 <+37>: callq 0x400450 <printf@plt>
0x00000000004005a7 <+42>: leaveq
0x00000000004005a8 <+43>: retq
End of assembler dump.
将根据自动脚本中堆栈上缓冲区的预期大小执行一些操作。但这削弱了剧本。我可以知道为什么要为缓冲区分配 16 个字节以便将其合并到脚本中吗?
【问题讨论】:
-
我已经用 GNU C -O0 编译了它,并且还在内存中分配了 16 个字节;使用 -O6 它增长到 32 个字节。请参阅下面的答案。
-
您能否添加这些“根据堆栈上缓冲区的预期大小执行”的操作?也许整个问题都有答案。
标签: c stack buffer disassembly