程序如下:
#include <stdio.h>
#include <windows.h>
void poor()
{
printf("poor!\n");
}
void rich()
{
printf("rich!\n");
ExitProcess(0);
}
void judge()
{
char want[10]; //局部变量为一字符数组,溢了它!
freopen("test.dat","r",stdin);
scanf("%s",want);
}
int main(int argc, char* argv[])
{
judge();
poor();
return 0;
}
按照这个程序的流程,本来是只能输出"poor"的.
"test.dat"里的最后四个字符其实是" 80 10 40 00",也即是rich()子过程的地址.
这个地址覆盖了"judge"返回时的EIP。
[ 此贴被yinx在2007-06-03 14:31重新编辑 ]