小さな (そして脆弱な) C サンプルがあります。
#include <unistd.h>
int main(int argc, char *argv[])
{
char buff[100];
if(argc < 2)
{
printf("Syntax: %s <input string>\n", argv[0]);
exit (0);
}
strcpy(buff, argv[1]);
return 0;
}
私はそれをコンパイルしました:
gcc -o basic_overflow basic_overflow.c -fno-stack-protector -fno-builtin
このプログラムを gdb で開くと、逆アセンブルは次のようになります。
Dump of assembler code for function main:
0x08048424 <+0>: push ebp
0x08048425 <+1>: mov ebp,esp
0x08048427 <+3>: and esp,0xfffffff0
0x0804842a <+6>: add esp,0xffffff80
...
main にブレークポイントを設定します (プロローグの後)。ローカル バッファーがあるため、スタック フレームのサイズは 100 バイトになると予想されます。しかし、$ebp-$esp を実行すると、結果が実際には 136 であることがわかります。
プラットフォーム:Linux user-VirtualBox 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
コンパイラ:gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
デバッガ:GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
何が間違っていたのでしょうか?