逆向工程乍看起来似乎很复杂,但是通过一个好的方法和工具包可以让你对其更加了解和使用时更得心应手。
方法
假设你已经下载了一个二进制文件,接着RE需要两种类型的分析,静态和动态。静态分析将帮助你更好的了解二进制文件中的内容,而动态分析则可让你逐步跟踪每个注册表中发生的具体变化以及使用哪些系统调用等。
静态分析
我必须承认,我没有时间评估目前各种不同工具。因为我发现了一种我认为比较好用的工具——Binary Ninja,它只有1.7k大小,且成本较低,只有99美元。
Binary Ninja专门用于静态分析,且提供了一个非常专业的图形用户界面,当你必须处理的信息量巨大时,Binary Ninja会非常有用。
如上图所示,Binary Ninja显示出了可执行文件的整个调用图,简化了了解每个块如何交互在一起的方式。此外,你可以通过右下角的选择菜单轻松切换视图。最后,左侧列举每个调用的函数,只需点击鼠标即可直接访问。
其所配置的upstream模块,还允许Binary Ninja具有以下功能:
1.在代码中放置评论;
2.通过汇编或C代码修补二进制;
3.允许API访问自己的插件并加速分析过程;
4.访问来自GitHub202可用的一堆插件;
注意:演示的Binary Ninja412版本是免费的,应该足够初学者使用。
动态分析
动态分析可以通过gdb,radare2等各种工具完成。从我个人的经验来看,radare2的用户交互不是很好,比如,没有样式表,我无法记住操作捷径,这让我浪费了很多时间!但是,gdb在用户友好性上就做得很好,而且,gdb的用户体验可以通过使用peda447(GDB的Python Exploit Development Assistance for GDB)进行改进,通过colourising和显示反汇编代码,寄存器,内存信息来增强显示gdb调试。
以下是增强型命令行界面:
为了向你展示如何应用和使用这种方法,我选择告诉你如何成功地使用卡内基梅隆二进制炸弹实验室(cmu binary bomb)的CTF平台。
这是第3阶段的入口点:
假设该解决方案是由3部分组成,两个整数和一个字符。
让我们打开0x08048bbf地址看看寄存器的状态。
输入尝试:1 2 3
好的,好像注册表EAX表示传递给sscanf的参数的数量。这证实了我以前的假设,即至少需要三个值才能传递给下一个区块(block)。
以下是下一个区块(block):
1. 检查第一个整数是否高于0x7。
2. 跳到与我第一个参数对应的情况
3.将BL寄存器设置为0x6b,并将第三个参数比较为0x7b。如果值相等,我们就跳到下一个块。
4.检查第二个参数是否等于先前设置的BL。
因此,我们可以假设密码应该是:
3:代表第三种情况
k:对应于ascii值0x6b
251:对应于十进制值0x7b
让我们试试吧!经过试验,果然证明我的假设是对的!正如你所看到的,这个挑战并不需要太多的动态分析。不过,目前很少有人使用该方法,所以如果利用它进行静态分析,至少可以节省你70%的分析时间。所以,仔细分析每一个代码以达到你的目标!
总结
正如已经证明的那样,每个人都可以使用逆向工程。然而,前提是你要拥有组装,内存管理以及编程方面的基本知识。因为,这会帮助你快速确定你的分析目标。
本文所配置的upstream模块,就是为了帮助32位/ 64位架构的RE Linux二进制文件,为此,我创建了一个git仓库,它包含一个docker映像以及分析时所需的工具。