simakuangbiao 发表于 2023-5-11 20:40

Crackme逆向分析365例-001

本帖最后由 simakuangbiao 于 2023-5-16 14:41 编辑

https://s1.ax1x.com/2023/05/16/p92bBZj.png


说明:本篇练习是表哥逆向分析365系列的第1例,所使用的CrackMe本体来自于网站:https://crackmes.one/,您可在此网站通过作者名或本体名查询下载,也可从本贴中提供的网盘地址下载,其CrackMe本体信息如下所示:
[*]本体名称: CrackMe
[*]本体作者:endofmarconia
[*]上传日期:2023-05-03
[*]运行平台:Windows
[*]难度【1-6】:1.2
[*]描述:本CrackMe专门为初学者制作,请破解出用户名和密码以便访问程序。


1、本次练习所需软件及下载地址:
[*]十六进制编辑器:HxD64,版本:2.5.0.0,下载地址:https://www.123pan.com/s/egPeVv-vrLQ3.html
[*]PE文件信息观察器:ExeinfoPE,版本:0.0.7.7,下载地址:https://www.123pan.com/s/egPeVv-drLQ3.html
[*]动态调试器:x32dbg/x64dbg,版本:2023-04-30,下载地址:https://www.123pan.com/s/egPeVv-TrLQ3.html
[*]CrackMe本体及附件:001-endofmarconia-20230503-1.2,下载地址:https://www.123pan.com/s/egPeVv-S8LQ3.html


2、逆向分析之前的准备工作
2.1、将下载的CrackMe本体解压到某个空白的逆向分析文件夹下(最好是全英文路径),并确保能够正常运行(云盘下载已经附带了4个缺失的运行库,若在您的电脑上还是不能运行,请根据提示的库名在:https://cn.dll-files.com网站查询下载并保存到与CrackMe本体相同文件夹内)。
2.2、复制CrackMe本体文件 CrackMe.exe并重新命名为CM001.exe,保证原始CrackMe本体文件的备份,逆向分析时仅针对CM001.exe。
2.3、启动ExeinfoPE.exe,加载CM001.exe,根据ExeinfoPE的分析数据,手动列出文件信息如下:
[*]文件名称:CM001.exe
[*]壳:无壳(不需要脱壳,可直接进行分析)
[*]位数:64位程序(需要使用x64dbg调试器进行分析)
[*]编译器:Microsoft Visual C++ 2022
[*]子系统:控制台程序
[*]映像基地址:0x140000000
[*]重定位段:有(需要修改文件属性标志字段,使其运行时不进行重定位)

2.4、启动HxD64.exe,加载CM001.exe,修改文件属性标志字段(从PE头偏移22个字节),将其值从0x22修改为0x23并保存文件,如图所示:
https://www.hualigs.cn/image/645cbbcb9a3ae.jpg
这样的话,映像基地址将固定在0x140000000,方便本次练习场景重现。
2.5、运行CM001.exe文件,随便输入用户名和密码后,程序出错了(错误信息为:Wrong username or password.),如下图所示:
https://www.hualigs.cn/image/645cbd38662e8.jpg

3、针对CM001.exe文件进行爆破
3.1、思路:由于出现了错误信息,我们有理由相信,程序对输入的数据进行了某种计算,并且对计算结果进行了验证判断,以此决定显示正确或错误信息。利用此思路,以当前出错信息加载指令为基点,通过向上或向下来查找到正确的条件转移指令,然后修改这条指令,使其忽略验证结果,直接显示正确信息。
3.2、启动x64dbg.exe,在菜单中打开【选项】窗口,在【事件】选项中仅选择【入口断点】(若已经配置好了,可省略此步骤)。
3.3、根据经验,出错信息很可能以字符串的形式存储在常量数据段中(本例的地址范围是:0x140022000-0x140028000),我们需要在代码段中定位出加载出错信息字符串的指令地址。现在点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,点击【搜索字符串】按钮,在【引用】页面底部的搜索框中输入:wrong username or password进行过滤后,共找到1处指令地址:0x140018795。鼠标左键双击地址,转到【CPU】页面的相关位置,以此条指令为基点(lea rdx,),向上查找最近的条件转移指令,其指令地址为:0x140018793(在本例中,其与基点紧挨着),如图所示:
https://www.hualigs.cn/image/645cbe24c768c.jpg
3.4、既然基点地址(0x140018795)是显示错误信息的指令分支,那么可以推测,红线尽头所指的地址(0x1400187DC)就是显示正确信息的指令分支了,我们只要修改地址(0x140018793)处的指令,使其忽略条件判断,直接转移到地址(0x1400187DC)处,就可以完成本次的爆破过程。
3.5、鼠标左键单击地址(0x140018793),按空格键弹出汇编窗口,将je修改为jmp,其余信息保持不变,然后按【确定】按钮使修改生效,如图所示:
https://www.hualigs.cn/image/645cbe8e64508.jpg
点击【补丁】按钮或Ctrl+P打开补丁窗口,点击【修补文件】按钮将修改另存为:CM001-已爆破.exe文件,如图所示:
https://www.hualigs.cn/image/645cbe91ea444.jpg
3.6、退出所有程序,运行CM001-已爆破.exe文件,看看爆破效果如何,如图所示:
https://www.hualigs.cn/image/645cbe958f5e1.jpg
效果很明显,同样的输入数据,不同的输出结果,说明爆破成功。注意:按照作者的原本意图,是要求破解出用户名和密码的,所以我们继续进行追码操作。

4、针对CM001.exe文件进行追码
4.1、思路:在上面的爆破过程中,我们已经定位出了显示成功信息的指令分支地址:0x1400187DC,所以我们可以从此地址进行反推,看看有哪些转移指令与此相关,从而推断出关键call,然后对这些关键call进行详细分析,理解其针对输入数据的计算逻辑以便追码。
4.2、启动x64dbg.exe,点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,按Ctrl+G打开地址转移窗口,输入:0x1400187DC,如图所示:
https://www.hualigs.cn/image/645cbe990e999.jpg
然后按【确定】按钮,这时可通过左侧红线观察到指令来源路线有2条,在源头附件还发现了2个call指令(地址分别为:0x140018789和0x140018772),这2个指令就是关键call了,分别在这2个地址上按F2键下执行断点,如图所示:
https://www.hualigs.cn/image/645cbe9cefb72.jpg
4.3、按F9键运行程序,然后在程序控制台界面上输入用户名(SMKB)和密码(123456789),回到调试器界面,这时已经中断在第1个关键call上,我们先看一下函数的参数是什么(64位程序规则,前4个参数通过rcx、rdx、r8、r9传递,多于4个的参数通过堆栈传递),鼠标右键点击寄存器(rcx和rdx),选择【在内存窗口中转到】(内存1和内存2),通过观察内存窗口发现,rcx指向我们输入的用户名SMKB,rdx指向字符串kanyefan,(注意:其实真实指向的是某个结构指针,但也无所谓了,因为结构中包含了我们需要关注的字符串,能理解就行),据此推测,kanyefan可能是超级用户,不需要判断密码。
4.4、按F9键继续运行,中断在第2个关键call上,使用同样的操作方法观察内存窗口发现,rcx指向我们输入的密码123456789,而rdx这次指向了堆中的一个地址:0x4376E0(此地址是动态分配的,每次运行各不相同,请使用您当前显示的地址),再次在内存窗口中转到这个堆地址,发现字符串kanyewestlover911,我们据此大胆推测,这是一个超级密码。
4.5、到此为止,已经不需要具体分析汇编代码了,可以确定:如果输入的用户名是kanyefan,那么密码可以随便了,否则,输入的密码必须是kanyewestlover911,在这种情况下就不会出现错误信息了,我们试一试吧,如图所示:
https://www.hualigs.cn/image/645cbea092327.jpg
https://www.hualigs.cn/image/645cbea42f648.jpg
果然如此,看来作者是kanye west(坎耶-维斯特)的脑残粉啊。

5、本例总结
[*]   通过出错信息字符串来定位显示错误或正确信息的转移指令位置,然后修改此指令,使其忽略条件判断,直接转向显示正确信息的指令分支,从而完成爆破。
[*]   以显示正确信息的指令分支为起点,查找其源头地址,并在源头附近定位关键call,然后详细分析以便追码(本例未进行详细分析,而是根据经验,推测并查找出了超级用户名和超级密码)。


PS:本贴到此结束,若转载请保留全部信息,期待我们在下一贴再见。

simakuangbiao 发表于 2023-5-14 13:20

oxf5deb3 发表于 2023-5-14 11:10
请问楼主4.4 的rdx 值0x4376E0 是怎么来的,就这里有点懵,请求解答,谢谢!

在4.4这里,即中断在第2个关键call的时候,rdx指向的是包含超级密码字符串的结构(这个结构中还存储了字符串长度等其他信息),而这个字符串本身是存储在堆中的,堆内存是动态分配的,每一次运行程序,这个存储地址都是不同的,我的贴子中是0x4376E0(我也标明了是堆地址),你在练习时可能是别的地址,无所谓的,检查一下你的堆地址,只要其存储的是超级密码字符串内容就ok的。

qq465881818 发表于 2023-5-13 10:40

.text:0000000140018793 jnz      short loc_1400187DC

simakuangbiao 发表于 2023-5-13 11:21

qq465881818 发表于 2023-5-13 10:40
.text:0000000140018793 jnz      short loc_1400187DC

在本例中,使用jnz或jne指令会出现一个小问题,如果输入超级密码:kanyewestlover911,反而爆破不了却出错。

huangshen100 发表于 2023-5-13 11:57

老哥加油,等待第二课

0skyline0 发表于 2023-5-13 14:25

NB!期待。

戰龍在野 发表于 2023-5-13 22:52

写得很详细好好学习学习

balley 发表于 2023-5-14 07:54

oxf5deb3 发表于 2023-5-14 11:10

请问楼主4.4 的rdx 值0x4376E0 是怎么来的,就这里有点懵,请求解答,谢谢!

zhiaipojie0313 发表于 2023-5-14 11:36

支持支持
页: [1] 2
查看完整版本: Crackme逆向分析365例-001