最近因为工作需要在看0day的软件漏洞分析,发现这本《0day安全软件漏洞分析技术(第2版)》真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践,于是笔者打算使用紧跟潮流但又尽量满足书上的环境——Windows 10 Profession 32Bit,希望对大家学习有所帮助。
一、环境以及要用的软件
系统:Windows 10 Profession
软件:UltraEdit、LordPE、OllyDBG、VC++ 6.0、IDA Pro
下图作者的系统信息,就是一个虚拟机而已:
二、实验目的
本次实验的目的是通过更改软件的十六进制值达到输入任何密码都能突破验证。
三、实现过程
首先我们用VC++ 6.0编写一个可供此次实验的C语言程序,代码如下:
#include<stdio.h>
#include<string.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
authenticated = strcmp(password, PASSWORD);
return authenticated;
}
void 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("No, your password is False!
");
}
else
{
printf("Yes, your password is True!
");
break;
}
}
}
上述代码的具体意思不作解释,若想看懂请自行翻阅C语言的相关书籍,比如C语言编程兵书等等。
上述代码经过编译运行会形成如下的运行结果:
从运行结果与我们程序的代码不难发现,这个软件的密码只会是1234567,那么现在关闭它,开始我们的破解之路吧。先用IDA Pro打开这个名为Crack的exe文件,作者的exe文件在C:MyProjectsDebugCrack.exe此目录下,大家请找到自己的文件所在位置,打开之后会出现如下图的样子:
某些时候打开会是一个一个的图片,请仔细看上图中的红框对应你软件的位置,那里有个黄色的小箭头,鼠标点住它往左拖就可以看到上面这种样式。
在上图黑框中有我们程序中出现的一句话,这里是输入错误密码时才会出现的,那么前面的“JE short_loc xxxxxx”这句话其实就代表了程序中的if语句,请将这句话前面的号码记住复制下来,我这里是004010D5,如下图:
为啥要记住这个呢?因为我们就要从if语句下手,分析程序可以知道if...else...语句其实就是用来判断我们输入密码正确错误的关键,所以要对症下药。
当我们找到004010D5时就可以关闭上一步的软件了,接下来打开OllyDBG,动态调试这个程序可以更好的为下面的步骤做准备,打开之后应该会出现下图所示:
按Ctrl+G,在弹出的窗口中输入刚刚复制的十六进制地址。如下图:
点击OK之后会跳转到前面第二步中我们看到的代码上。如上图红框,注意红框中的数字“74”哦!点击之后按F2,打个断点,接下来按F8进行单步调试,在Crack程序的运行框中出现“please input password”字样后输入一个错误的密码,再返回到上图,点击“JE short_loc xxxxxx”字样的代码句,下面一个小框中会出现“Jump is NOT taken”的字样。如下图:
这本身是一个错误的密码,按照程序的逻辑,它会给我们打印“No, your password is False!”,但别忘记我们的初心是想让它给我们打印“Yes, your password is True!”,这时候我们双击“JE short_loc xxxxxx”字样的代码句,在弹出的框中将“JE”改成“JNE”,后面保持原状,之后点击Assemble按钮,注意看这句话它前面的数字变成了“75”哦,最后点击Olly DBG软件最上面的倒三角按钮。如下图:
这时候再转回去看输出的结果,会惊奇的发现,打印的是“Yes, your password is True!”这样我们的目的就达到了,可这并不是我们的终极目标,我们是想要修改自己编的软件,从根源上修改它!于是进入下一步。
在这一步中我们需要用到第四个软件——LordPE,在打开之前请关闭OllyDBG软件,LordPE打开之后界面如下图所示:
点击PE Editor按钮打开Crack.exe之后会出现如下图所示:
这里主要是记住ImageBase后面的十六进制数字,用前面得到的十六进制数字减这个十六进制数字得到004010D5 - 00400000 = 0x10D5。
得到0x10D5后就可以关闭这个软件了,如果你用的是Windows10 64Bit的系统,就会发现你的ImageBase与我的完全不一样,如下图是64位Windows10的ImageBase:
这是最后一步,我们打开UltraEdit,将Crack.exe拖入UltraEdit中,会出现一大片数字和字母,打开之后按Ctrl + G,在弹出的框中输入0x10D5之后回车,会跳转到一个地方,如下图:
在上图中箭头指向的地方有一个醒目的74,还记得前面第3步说过的数字“74”么?对,没错,这里的74就是第3步中的74!还记得我们将“JE”改成“JNE”之后数字变成了“75”么?最后一步就是将这个“74”改成“75”,然后Ctrl + S保存即可哦,如下图:
这时候我们再用OllyDBG打开Crack.exe测试发现,如果输入的密码为1234567,反而是错的了,其余的则是正确。测试如下图:
以上是今天要学习的内容,后面作者会持续更新这一系列的内容,希望大家多多关注哦!
参考书籍
《0day安全软件漏洞分析技术(第2版)》 王清 主编