IT你好

加入 |登录

IT你好技术论坛广场红黑技术 › 查看主题

161

查看

6

回复
返回列表
run

Rank: 2

帖子
13 
精华
积分
134 
UID
79 
go

一个带有BUG的C源程序的简单分析

1
发表于 2009-12-28 00:15 | 只看该作者 | 倒序看帖 | 打印
#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,从而使结果出现错误,就这样就通过验证...
2

评分人数

  • xiaowuhello

  • ssfi

TOP

run

Rank: 2

帖子
13 
精华
积分
134 
UID
79 
2
发表于 2009-12-28 00:16 | 只看该作者
喜欢的可以看看

TOP

Rank: 8Rank: 8

帖子
62 
精华
积分
641 
UID
68 
3
发表于 2009-12-28 00:20 | 只看该作者
看过,呵呵,好厉害
Impossible into I'm possible

TOP

Rank: 8Rank: 8

帖子
62 
精华
积分
641 
UID
68 
4
发表于 2009-12-28 00:23 | 只看该作者
能做成视频更好哦
Impossible into I'm possible

TOP

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

帖子
1135 
精华
144 
积分
8341 
UID
5
发表于 2009-12-28 07:56 | 只看该作者
很强大啊 加分

TOP

cws

Rank: 2

帖子
22 
精华
积分
90 
UID
75 
6
发表于 2009-12-31 18:29 | 只看该作者
如果将第七行中的语句:char buffer[8];中的8改成9,输入8个Q或者其他都是不行的!!!

TOP

Rank: 8Rank: 8

帖子
62 
精华
积分
641 
UID
68 
7
发表于 2010-1-1 14:27 | 只看该作者
我也分析了下,呵呵,
Impossible into I'm possible

TOP

IT你好技术论坛

GMT+8, 2026-1-13 07:19, Processed in 0.038334 second(s), 11 queries.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.