CTF中的逆向工程-从0到0.01

什么是逆向工程呢?

CTF中的逆向工程(Reverse Engineering)是指通过分析目标程序的机器代码,还原出其设计和功能的过程。在CTF比赛中,逆向工程通常用于解密密码、绕过安全机制、理解恶意软件等方面。

逆向工程可以涉及到以下几个方面:

  1. 静态分析:使用反汇编工具(如IDA Pro、Ghidra)将程序的二进制代码转换为可读性较高的汇编代码,以便理解程序的结构和功能。

  2. 动态分析:通过调试器(如GDB、OllyDbg、x64dbg)来执行程序,并跟踪程序在运行过程中的行为,包括寄存器的变化、内存的读写等,以获取更多有关程序行为的信息。

  3. 逻辑分析:分析程序的算法、数据结构和控制流程,以识别关键的功能点和漏洞。

  4. 密码破解:通过逆向分析密码算法和相关的密钥生成过程,尝试还原出原始的密码或者找出密码的漏洞。

  5. 漏洞挖掘:通过逆向分析程序的代码和运行行为,寻找其中的安全漏洞,例如缓冲区溢出、格式字符串漏洞等。

IDA Pro的使用

IDA Pro几乎是逆向佬必备的一个工具,本文将简单介绍一些使用方法。

快捷键

按键

功能

SHIFT + F12

打开字符串窗口,一键查找所有字符串

CTRL + F12

打开函数调用图

CTRL + X

跳转到对操作数的交叉引用

ESC

在反汇编窗口可回退到上一操作的视图

F5

一键反汇编

D

在反汇编窗口中可以将代码转换成数据

C

在反汇编窗口中可以将数据转换成代码

P

在反汇编窗口中可以生成一个新函数

常见的一些算法

换表BASE64

这个算法在另一篇文章中有所涉及,这里不过多赘述。

传送门:换表Base64 - Cristrik010 (dotfogtme.ltd)

RC4

该算法特点见下图,该加密函数是需要密钥的,所以我们需要知道密钥才能调用RC4加密函数。

image-20231009170537106

XOR

这个的特点用一段代码表示一下:

a = 4^5
print(f"a ^ 4 = {a ^ 4}" )
print(f"a ^ 5 = {a ^ 5}" )
# 输出:
# a ^ 4 = 5
# a ^ 5 = 4

花指令

什么是花指令?

花指令简单来说就是一段垃圾代码,不会影响程序运行,但是会影响反编译。

手动清除花指令

步骤可以总结为:找到花指令然后nop

以2023MoeCTF的一道题为例

找到main函数,然后反编译得到

image-20231009173448801

从这里我们可以知道flag为36位。下面两个函数应该与flag有关,我们点进去看看。

image-20231009173551240

可以看到应该就是花指令了,我们进入反汇编窗口看看。

image-20231009173652581

然后我们手动清除,选中00460612然后按D将代码转换成数据,然后右键nop掉。

image-20231009173951550

然后选中变黄的代码,按C转换成代码。

最后找到函数开始处,按P生成新函数。

image-20231009174228554

回到主函数,发现反汇编已经正常。

image-20231009174327075

这道题有两个花指令,另一个处理方法相同。