
#include<stdio.h>
#include<string.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[8];//here!BUG
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);//here!BUG
return authenticated;
}
main()
{
int valid_flag=0;
char password[1024];
while(1)
{
printf("please input password ");
scanf("%s",password);
valid_flag=verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("congratultion!you have passed the verification!\n");
break;
}
}
getchar();
getchar();
}
复制以上代码,用VC++编译.....
并命名为overflow
得到.exe文件,,,,,执行看下,,,,,
本来输入1234567才可通过验证,,,,
可是,输入qqqqqqqq一样通过,(因为有BUG)
OD载入,,,,,在call overflow.strcmp的下一条语句:add esp,8下断点,,,,(F2),,,,
按F9运行程序,,,,,输入qqqqqqqq成功截断,,,,,F8单步执行,,,,,,直到call overflow._chkesp(此条不运行),
注意观看OD的右下角,,,,,,此时可看到:(这是我的机器,可能会因为不同的硬件配置而异)
0012FAD8 71717171 qqqq
0012FADC 71717171 qqqq
0012FADC 00000000 ....
所以此时authenticated的值已被修改为00 00 00 00(本来是00 00 00 01见0012FADC 00000000 ....),
最后一个q使buffer的最后一个标志字符数组结束的'\0'(NULL)冲掉01,从而使结果出现错误,就这样就通过验证...