参考《0day安全 软件漏洞分析》做的,个人学习记录
工具:
- x64dbg;
- 010Editor
- IDA Pro
- LordPE
密码验证小程序源码:
#include<stdio.h>
#include<string.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;
}
}
}
运行exe,如图
第一步:用IDA生成反汇编代码
把编译生成的exe文件拖到IDA上运行会自动生成流程图
找到跳转语句,也就是if分支点,选中后按空格切换到汇编指令界面
该指令对应的虚拟内存地址为00000000004015AF
第二步:在x64dbg中动态调试
在x64中打开exe文件,按ctrl+G,找到00000000004015AF 内存地址
将对应地址里的十六进制代码74(je) 改成 75(jne),然后继续调试,输入错误密码可以跳转密码正确提示
这只是在内存中修改,下面展示如何在在二进制文件中修改
第三步:用LordPE获得PE文件的节信息
启动LordPE,点击“PE编辑器”,选中目标exe文件,点击“区段”
获得区段表
算出节偏移 = VOffset-ROffset = 00000A00
已知虚拟内存地址(VA)=00000000004015AF
计算文件偏移地址 = VA - 装载基址 - 节偏移 = 00000000004015AF - 0x00400000 - 00000A00 = 0x00000BAF
第四步:用010Editor修改二进制文件
用010Editor打开exe文件,按ctrl+G,搜索0BAF,也就是文件中距离文件开始处0BAF字节的地方。对应的机器码刚好是74(je),修改成75(jne)
保存后重新运行exe文件,此时输入错误的密码弹出密码正确,破解成功