以下代碼包含一個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 <[email protected]>
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 <[email protected]>
0x00000000004005a7 <+42>: leaveq
0x00000000004005a8 <+43>: retq
End of assembler dump.
某些操作將根據自動化腳本中堆棧緩衝區的預期大小執行。但是這削弱了劇本。我可否知道爲什麼16字節被分配給緩衝區,以便我可以將它合併到腳本中?
我用GNU C -O0編譯它,並且在內存中分配了16個字節;與-O6它增長到32個字節。請參閱下面的答案。 – rslemos
您可以添加哪些操作是「基於堆棧上的緩衝區的預期大小執行的」?也許對整個問題有一個答案。 – rslemos