手把手教您玩转Malwarebytes CrackMe (上篇) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

手把手教您玩转Malwarebytes CrackMe (上篇)

fanyeee 破解大赛 2017-11-14 12:35:56
33689919
收藏

导语:

这篇文章的主题是Malwarebytes CrackMe——我最近创建的恶意软件分析挑战题。这个挑战最初是为了内部训练目的而设立的,通过Twitter发布后引发许多积极的响应。感谢所有发送Write Up的人!

当然,在解决这个挑战题目的过程中,许多人也是举步维艰,所以需要更多的解释和指导。所以,在本文中,我们将手把手为读者详解如何解决这个CrackMe。尽管这里的介绍已经非常详尽了,但是如果缺乏逆向工程经验的话,做起来可能还是有一定的难度。不过不要紧,如果您还有弄不明白的地方,请不要犹豫,直接在评论中提问就好了。

虽然这个CrackMe相对来说比较简单,但是它仍然为读者展示了恶意软件通常使用的各种技术——这对于恶意软件分析的新手来说,仍不失为一个很好的练手机会。像往常一样,文中所演示的解决方案只是各种可能的方案之一。

本文涉及的技术

我们想通过该CrackMe砥砺读者的下列技术/技巧:

· 注意常见的免杀技巧(反调试、反vm等),以绕过防病毒检查

· 检测经过异或方式混淆过的payload,并对其进行解码

· 加深对RunPE技术的基本理解

· 寻找调试/加载shellcode的方法

使用的环境和工具

在分析环境方面,我使用的是安装在Virtual Box中的32位Windows 7系统,并连接了Internet。

在分析过程中,我使用了以下工具:

· 静态分析:IDA

· 动态分析:ImmunityDbg/OllyDbg/x64dbg

· PE-bear

· Fiddler

第一阶段

当我们运行CrackMe时,首先会看到如下所示的标语:

1.png

如果拿到一个下列格式的旗标,该CrackMe的破解就算成功了:

flag{...}

这里没有任何密码提示——我们只能看到屏幕上的失败提示。要想了解更多信息,唯一的方法就是查看其内部代码。为此,我将借助IDA软件来进行分析。

寻找关键变量

由于代码没有经过混淆处理,所以经过一番检查之后,我们可以很容易地找到这个信息:

11.png

这里的关键是要找到AL注册表的值(AL=0会导致失败)。这个值是在上面函数sub_4014F0中进行设置的。下面,让我们进入函数,看看它到底在哪里:

111.png

我们看到,这里有一个变量(IDA自动将其命名为szUrl,暗示它可能被用作URL),并且它会被传递给一个函数sub_403380。之后,这个函数的输出(就目前来说,我们可以猜测它是一些校验和数据)将与硬编码的输出进行比较。如果两者相匹配的话,AL被设置为1。所以,我们的目标是为szUrl填充一些适当的数据,以便使其校验和为0x3B47B2E6。

寻找相关的引用

首先,让我们来看看变量szUrl的外部引用(xref),从而了解其使用方式以及在哪里进行的设置。我们可以通过在IDA中按组合键CTRL+X来查找这些引用:

1111.png

正如你所看到的那样,代码中的三个地方引用了这个变量。第二个(高亮显示的)引用来自我们当前所在的地方(szUrl被传递给校验和函数进行相应的计算的地方)。

该变量是如何使用的?

第三个外部引用可能会涉及到这个变量的用法。所以,让我们仔细看看:

2.png

进入函数sub_4033D0,会看到有一些与读取给定URL内容有关的API调用,例如:

22.png

以及:

222.png

我们现在可以肯定的是,变量szUrl(如果能正确填写其值的话)是用来从互联网上下载某些东西的。

变量是如何填充的?

现在,让我们考察第一个引用,并找出szUrl的值到底来自哪里:

2222.png

我们可以看到,它是传递给函数sub_4031C0的参数之一。这个函数也需要用到一个DWORD数组。接下来,让我们来看看这个函数的内部代码。我们可以发现,它使用了Windows Crypto API:

3.png

就像您看到的那样,传递给它的内容将通过Windows API使用AES算法进行解密。

根据参数的传递顺序,我们很容易猜到这个函数是用于对传入的缓冲区(DWORD数组)数据进行解密的,而szUrl将被用来存储输出结果。所以,我们唯一需要关心的是获取用于解密的有效密钥。这样,我们就能得到一个校验和为0x3B47B2E6的相应URL了。

寻找解密密钥

该密钥来自于另一个缓冲区的哈希值,并作为函数参数之一进行传递。我们可以看到,这里的Windows Crypto API就是用来计算哈希值的。这里使用的哈希函数是SHA256(算法ID:0x800C = CALG_SHA_256(链接地址:https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx)):

33.png

这个哈希函数用来生成AES128密钥(算法ID:0x660E = CALG_AES_128(链接地址:https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx)):

333.png

我们的研究发现,作为密钥的基础的缓冲区是作为第四个参数传递给函数的:

3333.png

我们把它命名为key_buf,并弄清楚了它是从哪里传递给这个函数的:

4.png

同样,通过这个外部引用,我们可以了解到它是在哪里进行设置的详细信息:

44.png

我们发现,整个缓冲区是由各种函数设置的DWORD所组成的。接下来,让我们来逐个考察这些函数。

现在,我们要做的事情变得越来越简单:我们进行各种环境检查,也就是恶意软件常常用来识别是否在受控环境中运行的那些检查。例如,检查是否在调试器下运行:

444.png

虽然恶意软件检测到在调试器下运行的时候通常会终止执行,但就本例来说,情况正好相反。因为,每通过一项检查,就会为缓冲区添加相应的一段数据,而我们需要捕获所有的数据!

我们可以通过跟踪每个检查并进行相应的修改(删除条件跳转)来达到这个目的,因为这样就能无条件地将相应的数据添加到缓冲区了。当然,你可以使用IDA完成修改任务(链接地址:http://resources.infosecinstitute.com/applied-cracking-byte-patching-ida-pro/#gref),但恕我直言,这样很不方便。所以,我通常会借助于一些其他的工具(如OllyDbg或PE-bear之类的调试器)来进行修改,而IDA只是用于查找分支。

例如:删除PE-bear中的条件检查:

根据检查的偏移量(CTRL+R)进行跳转:

4444.png

选中十六进制视图中的相关字节,然后进行修改:

5.png

结果:

55.png

在跟踪并删除所有检查之后,我们可以将修补后的文件保存:

当部署这个修改后的版本(链接地址:https://www.hybrid-analysis.com/sample/71f4450d411d8d721f18e75713a5663299b3d770ffef61177e45b48cf3896d32?environmentId=100)的时候,我们会看到一些进度信息!例如,屏幕上将显示信息“You are on the right track!”。同时,我们还会看到有一些东西正在进行解压处理。

555.png

小结

在本文中,我们详细介绍了解决Malwarebytes CrackMe挑战第一阶段任务的相关方法,如查找关键变量和引用,如查找关键变量和引用,了解变量的用途和填充方式等。在下一篇文章中,我们将继续为读者详细介绍完成第二阶段任务的具体过程。

  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务