实验环境:
操作系统 | Windows7 |
IDE | VC 6.0 |
build版本 | debug |
用于实验的C语言代码:
#include<stdio.h>
#define PASSWORD "1234567"
int verify_password(char * password)
{
int authenticated;
authenticated = strcmp(password,PASSWORD);
return authenticated;
}
int 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("Congratulation! You have passed the verification!\n");
break;
}
}
}
程序运行结果:
在IDA中查看该.exe文件,其中部分函数流程图如下:
根据cmp eax, 0的结果:执行跳转指令。
修改此处代码,即可实现 绕过输入的密码等于1234567的验证。
在IDA中,找到此处地址:
在OllyDbg中查看该.exe文件:
将地址为00401D5处修改为:
即颠倒逻辑,错误的密码通过验证,正确密码则要求重新输入。
F9运行结果:
上面只是在内存中修改程序,下面修改.exe
用LordPE打开.exe文件后,点击Sections,查看该PE文件的节信息:
看到存储二进制机器代码的.text节(section)的虚拟内存地址(VOffset)为00001000,文件偏移地址(ROffset)为00001000
的到00410D5处:JZ 指令的文件偏移地址为:
0x00410D5 - 0x00400000(ImageBase) - (0x00001000 - 0x00001000) = 0x10D5
用UltraEdit打开.exe文件:
Ctrl + G:
将原来的机器代码74改为75,保存文件。
直接打开.exe,并输入1234567发现 提示incorrect Password!
实验成功!