当前位置: 首页 > 技术干货 > CTF REVERSE练习之API断点

CTF REVERSE练习之API断点

发表于:2021-03-03 15:22 作者: mtr 阅读数(1308人)

你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,点击获取免费靶场>>


在逆向分析中经常会遇到输入表这个概念,输入表中保存的是在程序中调用的但定义在其他DLL中的函数信息以及对应的DLL信息。我们在程序中直接调用Windows API的时候,这些API都可以在程序的输入表中可以看到。

使用PEiD可以方便的查看程序的输入表结构,将程序载入PEiD后,点击主界面中的“子系统”,在弹出的“PE细节”中点击“输入表”就可以打开“输入表查看器”了,如图所示:

图片1.png

在实验《CTF REVERSE练习之API定位》中使用的方法其实就是通过输入表中的API来定位关键函数代码的。

图片2.png

虽然输入表中可以看到程序使用了哪些API,进一步通过OD的API参考断点,或者是IDA中的交叉引用就可以定位到程序在哪些地方使用了这些API,但是我们也可以通过动态调用的方式来消除输入表中的API特征。

消除了特征是不是我们就找不到了啊,那我们怎么做题呢

我们可以通过配合使用LoadLibrary以及GetProcAddress,我们就可以动态获取API函数的地址了,其中LoadLibrary用于加载动态链接库,GetProcAddress用于获取指定动态链接库中指定API函数的地址。动态调用的API无法通过OD的输入表API参考断点或者IDA的交叉引用来进行定位。

API断点

在OD中可以对特定的API设置一个断点,不管是直接调用的API还是动态调用的API。

在OD的反汇编指令窗口中按下Ctrl+G快捷键,在弹出的对话框中输入MessageBoxA,单击“确定”按钮后就可以来到MessageBoxA的函数代码了,我们对其第一条指令设置一个断点,即在77D507EA按下F2即可。

图片3.png

在OD左下角的Command窗口中输入bp命令也可以下断点,比如输入bp MessageBoxA,按下Enter就可以对MessageBoxA设置一个断点了。

图片4.png

下面开始实验。

打开蚁景网安实验室(www.yijinglab.com)搜索实验《CTF REVERSE练习之API断点》。

先看题目描述:

主机C:\Reverse\3目录下有一个CrackMe3.exe程序,运行这个程序的时候会提示输入一个密码,当输入正确的密码时,会弹出过关提示消息框,请对CrackMe3.exe程序进行逆向分析和调试,找到正确的过关密码。

这个CrackMe程序不再直接调用MessageBoxA这个API,主要考察通过API断点以及MessageBoxA的阻塞特性来定位关键函数代码的方法,以及在逆向分析中结合使用OD与IDA的方法。

这个实验中程序的外部行为与《CTF REVERSE练习之逆向初探》、《CTF REVERSE练习之API定位》两个实验的程序行为是一致的,因此这里不再赘述。

使用OD载入CrackMe3.exe程序之后,按下Ctrl+G快捷键,输入MessageBoxA定位到MessageBoxA的代码,在第一条指令按下F2设置一个断点,如图所示:

图片5.png

按下F9使程序执行起来,随便输入一个密码(如test)后单击“确定”按钮,程序将在MessageBoxA中的第一条指令断下,这时候依次点击OD菜单中的“调试”——“执行到用户代码”,如下图所示:

图片6.png

我们继续看题这时候CrackMe的错误提示消息框将会弹出来,我们点击消息框的“确定”按钮,程序在OD中会再次断下。这次是因为点击了“执行到用户代码”的原因,OD会在调用了MessageBoxA的下一条指令自动断下,如图所示:

图片7.png

可以知道004015F6处的call就是调用了MessageBoxA函数:

004015F6 . FF55 60 call dword ptr [ebp+60]

我们按F8进行单步跟踪,就可以看到一个奇怪的字符串,而这个字符串就是我们要找的过关密码,如图所示:

图片8.png

我们来用IDA进行分析在实验步骤一中,我们在MessageBoxA断下后,通过“执行到用户代码”回到CrackMe空间的代码,通过简单的F8单步跟踪,就很幸运的看到了过关密码。然而在实际调试过程中,可能需要跟踪很久才能发现一点蛛丝马迹,那么我们可以结合IDA的静态分析功能来加速我们的逆向过程。

在前面的分析中,我们知道在004015F6这个地址调用了MessageBoxA函数,现在使用IDA载入CrackMe3.exe,待分析结束后按下G,然后输入“004015F6”后点击OK按钮,就会自动跳转到004015F6这个地方了,如图所示:

图片9.png

我们在这里按下F5生成函数的伪代码。因为程序中已经对LoadStringA以及MessageBoxA这两个API进行了动态调用,所以这里的伪代码看起来也是非常怪异了,不过我们可以通过添加注释来帮助我们对程序的理解,如图所示:

图片10.png

可以看到程序使用了strcmp对输入的密码进行了判断,如果是HeeTianLab则弹出正确提示,否则弹出错误提示。

第三种利用MessageBox的阻塞特性定位关键代码。

我们知道MessageBox是一个阻塞的API,就是当调用这个API的时候,会弹出一个消息框,此时程序的代码执行流就会自动阻塞在调用MessageBox的地方,直到点击提示框上的按钮或者关闭提示框时,程序才会继续往下执行。

那么在程序弹出MessageBox的时候,我们可以在OD中让程序断下来,然后通过“执行到用户代码”来回到调用MessageBox的地方,这就是说MessageBox本身就类似于“断点”。

使用OD载入CrackMe3.exe,如果之前设置了断点,为了防止干扰,我们需要先清除掉之前设置的断点。通过OD的菜单项“查看”——“断点”可以打开断点窗口,然后通过右键菜单来删除已经设置的断点,如图所示:

图片11.png

断点清理完毕之后,按F9运行程序,随便输入一个密码(如test)进行测试,在弹出消息框之后不要关闭消息框,在OD顶部的工具栏中点击“暂停”执行按钮(或者按F12快捷键),程序就会自动断下,如图所示:

图片12.png

这时候依次点击OD菜单中的“调试”——“执行到用户代码”, 我们点击消息框的“确定”按钮,程序在OD中会再次断下。这次是因为点击了“执行到用户代码”的原因,OD会在调用了MessageBoxA的下一条指令自动断下,如图所示:

图片13.png

接下来和实验步骤一的情况类似了,F8单步跟踪就能看到密码了。

逆向真的是一个很复杂的知识点,想要掌握需要花不少时间,这次实验和上次学习的API定位结合的很紧,有了API定位基础本次实验也能比较好理解。


 这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!

靶场.png