书中摘抄的代码如下,编译后的EXE文件,实现了简单的密码校验的功能。此次实验的目的,是按照书中的描述,修改EXE文件,使输入非匹配的密码可以通过验证。
#include <stdio.h>
#include <string.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
authenticated=strcmp(password,PASSWORD);
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("Congratulation! You have passed the verification!\n");
break;
}
}
}
使用Dev-C++ 5.11进行编译,编译的时候选择32位程序发布,编译生成文件0day_test1.exe:
图一该程序运行效果如下:
图二使用IDA静态反编译工具打开该EXE文件,找到匹配PASSWORD的判断分支指令,尝试修改EXE的代码逻辑为:PASSWORD匹配失败跳转到原来的密码比较成功逻辑分支,实现输入非匹配密码可以通过验证。
图三在该指令上按空格切换命令界面,获取该指令的VA地址
图四得到该指令的VA地址在.text段的00401578,可以看到得到的VA地址和原书中描述的地址并不一样。
.text:00401578 jz short loc_401588
关掉VA,使用管理员权限打开ollydbg,打开0day_test1.exe:
然后使用CTRL+G直接跳转到上述的VA地址
图五双击该指令,将原本的“JE SHORT 00401588”改成“JNE SHORT 00401588”
图六可以看到指令已经被改:
图七目前被被改的仅仅是内存中的指令,需要写到EXE文件中。书中使用原始的方式在EXE文件中找到指令并修改,由于ollydbg有现成的功能实现这个功能。
单击该指令,右键--Edit--Copy to executable
图八弹出窗口提醒保存文件,确认OK。然后从窗口选择保存文件
图九 图十运行破解的EXE文件,可以发现输入错误密码可以通过认证。
图十一上面使用ollydbg实现PE文件(EXE文件)的格式修改,下面实验手工查找PE文件中的执行指令。
使用PE Explorer打开PE文件
图十二EXE文件的代码段.text段,内存装载基地址(Image Base)=00401000
指令的虚拟内存地址(VA)=00401578
.text段文件中偏移地址 = 00000400
计算指令的文件偏移地址
指令在文件偏移地址=虚拟内存地址(VA)- 装载基址(Image Base)+.text段文件中偏移地址
=00401578-00401000+00000400
=978
使用WinHex直接跳到指令在文件偏移地址:
图十三 图十四改成:
图十五保存文件,并运行:
网友评论