逆向工程入门经验分享

前言

几天前,我决定开始自己的”逆向工程”冒险之旅了,尽管在汇编和编程方面有扎实的基础,但是我还是被一大堆的信息和OP代码淹没了,这些代码搞得我头昏脑胀。

逆向工程乍看起来似乎很复杂(实际深入进去,发现真的很复杂),然而,起步阶段,关键是要用对方法,另外一个好的工具箱也很重要。

这篇文章正是记录我自己在逆向工程领域入门阶段的一些经验,希望分享给大家,欢迎交流。

方法论

首先,下载可能是你人生中的第一个二进制文件,下载好之后,你要认识到针对RE文件有静态和动态两种类型的分析方法。静态分析可以帮你更好的了解和理解二进制文件中的内容,动态分析则允许你一步一步进行调试,跟踪每个寄存器中发生的变化、每次系统调用等。

本文是一个入门指导,我讲述的一些方法都是非常基础的。比如说静态分析开始时先浏览并找出一些感兴趣的零散的代码,想要深入分析这些代码,需要用到动态分析,这么一说也不是太难,你觉得呢?这个过程中,有哪些工具可以拿来使用呢?

静态分析

必须承认,我没有花费大量的时间去评估网上的各种工具,事实上,我直接就选择了binary ninja  (https://binary.ninja/purchase/),个人/学生版 $99。相对于它的功能而言,这个价位相当划算,另外,DeMo 版本是免费的,提供的功能对于初学者而言就够用了( https://binary.ninja/demo/ )。

Binary ninja致力于静态分析,GUI非常精美,想到你必须要处理的信息量,有一个精巧的GUI相当的重要。

正如上图所示,binary ninja 界面上展示了可执行文件的整个调用图示,简明扼要的展示出了每个块之间是如何相互作用的。此外,通过右下角选择菜单,可以轻松的进行视图切换。点击鼠标,左侧就会枚举出所有被调用的函数。

逆向工程入门经验分享

重点强调,binary ninja 还可以:

官方插件GitHub地址:https://github.com/Vector35/binaryninja-plugins/tree/master/plugins 

动态分析

动态分析可以使用 GDB,radare2等工具。对我而言,radare2 的用户体验太糟糕了,没有样式表,一个快捷键也记不住,耗费了我大量的时间。GDB 在这方面做的不错,此外,可以通过peda449对GDB的用户体验进行改进。

gdb+peda,高能!效果看下图:

逆向工程入门经验分享

范例

方法讲过了,工具准备好了,下边提供一个实际案例,供大家参考。

逆向工程入门经验分享

以@isislab 提供的CTF架构平台为例,讲解一下我是如何通过炸弹实验室的第三关的。

平台地址:https://skidophrenia.ctfd.io

第三关的切入点如下图所示:

逆向工程入门经验分享

假设:答案似乎由三部分组成:两个整数和一个字符

不妨从0x08048bbf的地址入手,看一下寄存器的状态

尝试输入:1 2 3

逆向工程入门经验分享

OK,看起来 EAX参数传递给了sscanf函数。这证实了之前的假设是成立的,事实上,至少需要三个值,这是传递到下一个块的必要条件。

下一个块:

逆向工程入门经验分享

解释

  1. 检查第一个整数是否是 0x7以上,如果是,炸弹会爆炸;
  2. 跳转到与第一个参数相对应的情况;
  3. 设置BL注册值为0x6b,拿第三个部分的值与0x7,如果相等,跳到下一块,否则炸弹爆炸;
  4. 检查第二部分值是否等于上一步设置的BL的值,如果不等,炸弹爆炸。

因此,我们可以假设密码应该是这样的:

3:对应第三种情况;
k:0x6b对应的ASCII码值;

251:相应于0x7b的十进制值

接下来,我们来验证一下:

逆向工程入门经验分享

完成挑战!

正如你所看到的我,这个案例中不需要太多的动态分析,不过这种情况在实际操作时很少遇到。之所以展示这个练习,是为了让你了解静态分析的重要性,因为它将负责完成70%的工作了,所以,为了达到目标,请仔细分析每一段代码。

结论

事实证明,了解逆向工程的知识对每个人都是有益处的。

多掌握一些汇编、内存管理和编程知识,会帮你快速的定位问题,精确的修补或绕过安全措施。

此外,耐心和奉献精神也有助于你技能的提高。

*参考来源:0x00sec, 

源链接

Hacking more

...