0x01 实验环境:
操作系统 | windows10 | |
---|---|---|
编译器 | visual C++6.0 | |
编译选项 | 默认编译选项 | |
build版本 | release版本 | release和debug都可以 |
0x02 release
用vc++6.0编译出来一个release版本;
改变可执行文件得执行流程,使输入任何字符都可以进入正确的执行流程;
code
/*****************************************************************************
To be the apostrophe which changed "Impossible" into "I'm possible"!
POC code of chapter 3.7 in book "Vulnerability Exploit and Analysis Technique"
file name : crack_me.c
author : failwest
date : 2006.9.20
description : used as a simple demo to show how to crack a PE file
Noticed : should be complied with VC6.0 and build into release version
version : 1.0
E-mail : failwest@gmail.com
Only for educational purposes enjoy the fun from exploiting :)
******************************************************************************/
#include <stdio.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;
}
}
system("pause");
}
0x03 ida
3.1
把crack_me(release_creak).exe拖进IDA,如图:
3.2
用鼠标选中程序的分支点,按空格键进入到汇编界面,看到代码段和VA : 0040106E。
注:IDA已把该指令的地址换算成了运行时的内存地址。
0x04 OllyDbg
4.1
用OllyDbg动态调试,看程序是怎么分支的,OllyDbg加载文件之后使用快捷键Ctrl+G直接跳转到这个VA地址处;
4.2
快捷键F2在0040106E地址处下个断点,快捷键F9让程序运行起来,这时OllyDbg暂时挂起,到程序提示输入密码的console界面随便输入一个错误的密码,回车确认之后,OllyDbg会重新中断程序
修改:
0040106C 85C0 test eax, eax ##密码验证返回值存在eax里,这里判断eax是否为0; 修改方法1: test修改为xor
0040106E 74 0F je short 0040107F ## 修改方法2: 把这里修改为jne
保存:
鼠标右键,"复制到可执行文件->所有修改->全部复制->鼠标右键(保存)->所有修改"把修改部分保存下来即可
4.3
修改之后,机器码je(74)修改为jne(75),这个也可以直接在PE文件中找到这个位置修改;
4.4
结果:
0x05 PE
在PE文件中把指定地址的je修改为jne;
用工具查看下这个区段的偏移值
PE文件的偏移 = 虚拟内存地址(VA)- 装载基址(Image Base)- 节偏移
= 0040106E – 0x00400000 – (0x00001000 – 0x00001000)
= 0x106E
在PE文件中在这个位置把74修改为75即可;