2

Crackme逆向分析365例-001 - 表哥-【SMKB】

 1 year ago
source link: https://www.cnblogs.com/SMKB/p/17391913.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Crackme逆向分析365例-001

【Crackme逆向分析365例-001】

   表哥是神,误落凡尘


说明:本篇练习是表哥逆向分析365系列的第1例,所使用的CrackMe本体来自于网站:https://crackmes.one/,您可在此网站通过作者名或本体名查询下载,也可从本贴中提供的网盘地址下载,其CrackMe本体信息如下所示:

  • 本体名称:[EASY] CrackMe
  • 本体作者:endofmarconia
  • 上传日期:2023-05-03
  • 适用平台:Windows
  • 难度【1-6】:1.2
  • 描述:本CrackMe专门为初学者制作,请破解用户名和密码以便访问程序。

1、本次练习所需软件及下载地址:

2、逆向分析之前的准备工作

2.1、将下载的CrackMe本体解压到某个空白的逆向分析文件夹下(最好是全英文路径),并确保能够正常运行(云盘下载已经附带了4个缺失的运行库,若在您的电脑上还是不能运行,请根据提示的库名在:https://cn.dll-files.com网站查询下载并保存到与CrackMe本体相同文件夹内)。

2.2、复制CrackMe本体文件[EASY] CrackMe.exe并重新命名为CM001.exe,保证原始CrackMe本体文件的备份,逆向分析时仅针对CM001.exe。

2.3、启动ExeinfoPE.exe,加载CM001.exe,根据ExeinfoPE的分析数据,手动列出文件信息如下:

  • 文件名称:exe
  • 壳:无壳(不需要脱壳,可直接进行分析)
  • 位数:64位程序(需要使用x64dbg调试器进行分析)
  • 编译器:Microsoft Visual C++ 2022
  • 子系统:控制台程序
  • 映像基地址:0x140000000
  • 重定位段:有(需要修改文件属性标志字段,使其运行时不再重定位)

2.4、启动HxD64.exe,加载CM001.exe,修改文件属性标志字段(从PE头偏移22个字节),将其值从0x22修改为0x23并保存文件,如图所示:

645cbbcb9a3ae.jpg

这样的话,映像基地址将固定在0x140000000,方便本次练习场景重现。

2.5、运行CM001.exe文件,随便输入用户名和密码后,程序出错了(错误信息为:Wrong username or password.),如下图所示:

645cbd38662e8.jpg

3、针对CM001.exe文件进行爆破

3.1、思路:由于出现了错误信息,我们有理由相信,程序对输入的数据进行了某种计算,并且对计算结果进行了验证判断,以此决定显示正确或错误信息。利用此思路,以当前出错信息加载指令为基点,通过向上或向下来查找到正确的条件转移指令,然后修改这条指令,使其忽略验证结果,直接显示正确信息。

3.2、启动x64dbg.exe,在菜单中打开【选项】窗口,在【事件】选项中仅选择【入口断点】(若已经配置好了,可省略此步骤)。

3.3、根据经验,出错信息很可能以字符串的形式存储在常量数据段中,我们需要在代码段中定位出加载出错信息字符串的指令地址。现在点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,点击【搜索字符串】按钮,在【引用】页面底部的搜索框中输入:wrong username or password进行过滤后,共找到1处指令地址:0x140018795。鼠标左键双击地址,转到【CPU】页面的相关位置,以此条指令为基点(lea rdx,[140023908]),向上查找最近的条件转移指令,其指令地址为:0x140018793(在本例中,其与基点紧挨着),如图所示:

645cbe24c768c.jpg

3.4、既然基点地址(0x140018795)是显示错误信息的指令分支,那么可以推测,红线尽头所指的地址(0x1400187DC)就是显示正确信息的指令分支了,我们只要修改地址(0x140018793)处的指令,使其忽略条件判断,直接转移到地址(0x1400187DC)处,就可以完成本次的爆破过程。

3.5、鼠标左键单击地址(0x140018793),按空格键弹出汇编窗口,将je修改为jmp,其余信息保持不变,然后按【确定】按钮使修改生效,如图所示:

645cbe8e64508.jpg

点击【补丁】按钮或Ctrl+P打开补丁窗口,点击【修补文件】按钮将修改另存为:CM001-已爆破.exe文件,如图所示:

645cbe91ea444.jpg

3.6、退出所有程序,运行CM001-已爆破.exe文件,看看爆破效果如何,如图所示:

645cbe958f5e1.jpg

效果很明显,同样的输入数据,不同的输出结果,说明爆破成功。

4、针对CM001.exe文件进行追码

4.1、思路:在上面的爆破过程中,我们已经定位出了显示成功信息的指令分支地址:0x1400187DC,所以我们可以从此地址进行反推,看看有哪些转移指令与此相关,从而推断出关键call,然后对这些关键call进行详细分析,理解其针对输入数据的计算逻辑以便追码。

4.2、启动x64dbg.exe,点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,按Ctrl+G打开地址转移窗口,输入:0x1400187DC,如图所示:

645cbe990e999.jpg

然后按【确定】按钮,这时可通过左侧红线观察到指令来源路线有2条,在源头附件还发现了2个call指令(地址分别为:0x140018789和0x140018772),这2个指令就是关键call了,分别在这2个地址上按F2键下执行断点,如图所示:

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,在这种情况下就不会出现错误信息了,我们试一试吧,如图所示:

645cbea092327.jpg
645cbea42f648.jpg

果然如此,看来作者是kanye west(坎耶-维斯特)的脑残粉啊。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK