洞洞! | 原喵空间

正文

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

作者:run
#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,从而使结果出现错误,就这样就通过验证...

回复

0%
站点地图友情链接:
喵宅苑
喵空间社区程序
络合兔
技术宅
莉可POI
Mithril.js
枫の主题社
Project1
午后少年
机智库
七濑胡桃
xiuno
幻想の博客