IT你好技术论坛
标题:
一个带有BUG的C源程序的简单分析
[打印本页]
作者:
run
时间:
2009-12-28 00:15
标题:
一个带有BUG的C源程序的简单分析
#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,从而使结果出现错误,就这样就通过验证...
作者:
run
时间:
2009-12-28 00:16
喜欢的可以看看
作者:
ssfi
时间:
2009-12-28 00:20
看过,呵呵,好厉害
作者:
ssfi
时间:
2009-12-28 00:23
能做成视频更好哦
作者:
xiaowuhello
时间:
2009-12-28 07:56
很强大啊 加分
作者:
cws
时间:
2009-12-31 18:29
如果将第七行中的语句:char buffer[8];中的8改成9,输入8个Q或者其他都是不行的!!!
作者:
ssfi
时间:
2010-1-1 14:27
我也分析了下,呵呵,
欢迎光临 IT你好技术论坛 (http://it.o-o.zone/)
Powered by Discuz! X1