run
一个带有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,从而使结果出现错误,就这样就通过验证...

xiaowuhello
很强大啊 加分
展开Biu

很强大啊 加分

[查看全文]
ssfi
能做成视频更好哦
展开Biu

能做成视频更好哦

[查看全文]
run
喜欢的可以看看
展开Biu

喜欢的可以看看

[查看全文]
ssfi
ssfi回复给帖子:879
展开Biu

看过,呵呵,好厉害{:2_26:}

[查看全文]
ssfi
我也分析了下
展开Biu

我也分析了下,呵呵,

[查看全文]
cws
如果将第七行中的语句
展开Biu

如果将第七行中的语句:char buffer[8];中的8改成9,输入8个Q或者其他都是不行的!!!

[查看全文]