Cyber Security Academy · 课时

逆向工程与 Pwn 基础

逆向工程与二进制利用入门。

第 3 / 4 课13 个步骤

逆向工程与 Pwn 基础 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。

逆向与二进制利用概览

有两类密切相关的 CTF 题目涉及编译后的程序:

  • 逆向工程(逆向) — 分析二进制程序以了解其行为,通常是为了还原密码检查逻辑,或找出会输出标志的隐藏逻辑。
  • 二进制利用 — 在运行中的二进制程序里寻找内存安全漏洞并加以利用,从而劫持执行流程;常见目标是在保存标志的远程服务上启动命令解释器。

逆向关注理解,二进制利用关注突破。两者都要求您熟悉底层概念。

初识二进制程序

不要在毫无准备的情况下直接用反汇编器打开二进制程序。请先使用快速的命令行工具进行初筛,了解其类型、体系结构以及是否包含明显的字符串。

# Identify file type and architecture
file ./challenge

# Pull human-readable strings (flags are sometimes left in plaintext)
strings ./challenge

# Check which security mitigations are enabled
checksec --file=./challenge

静态分析与动态分析

您可以用两种互为补充的方式分析二进制程序:

  • 静态分析 — 使用反汇编器或反编译器(例如吉德拉)或反汇编器视图,在不运行程序的情况下阅读代码。您可以看到完整的控制流,但必须推断运行时的值。
  • 动态分析 — 在 GDB 等调试器中运行程序,观察寄存器和内存中的实际值。您可以准确看到发生了什么,但只能观察您实际执行到的路径。

熟练的选手会在两者之间切换:先通过静态阅读形成理论,再通过单步执行进行动态确认。

阅读反汇编代码

要进行逆向,您需要阅读汇编代码。您不必熟练编写汇编,但必须能够识别以下模式:

  • 比较或测试指令后跟跳转(je、jne)表示比较和分支,通常就是密码检查。
  • 调用指令会调用函数;参数会在调用前被放入寄存器或栈中。
  • 数据移动指令会在寄存器、内存和常量之间移动数据。

当您发现输入与某个值进行cmp比较,随后又分支到成功消息时,就找到了检查逻辑。现在请还原或绕过预期值。

反编译器助您提速

现代反编译器可以将汇编代码还原为近似的 C 语言代码,其阅读速度远快于原始指令。反编译后的密码检查可能如下所示:

// Decompiler output (approximate)
if (strcmp(user_input, "s3cr3t_p4ss") == 0) {
    puts("Correct! Here is your flag:");
    print_flag();
} else {
    puts("Wrong.");
}

内存破坏的起点

二进制利用题目会利用这样的程序:将输入读入固定大小的缓冲区,却不检查输入长度。栈用于存储局部变量和保存的返回地址;函数结束时,返回地址会告诉 CPU 下一步跳转到哪里。

如果输入使局部缓冲区溢出,就可能覆盖保存的返回地址。谁能控制返回地址,谁就能控制接下来的执行位置。

// Vulnerable: no bound on how much is read into buf
void vuln() {
    char buf[64];
    gets(buf);   // reads until newline, ignores buf size
}

经典栈缓冲区溢出

最简单的二进制利用方式,是覆盖返回地址,跳转到程序原本不会调用的函数,例如会输出标志的隐藏win()函数。

步骤如下:

  • 找到从缓冲区起始位置到返回地址的准确偏移量(循环模式工具可以快速得出该值)。
  • 找到目标函数的地址。
  • 填充数据直到偏移量处,然后用目标地址覆盖返回地址。
# Build the input with a Python exploit library
from pwn import *

p = process('./challenge')
offset = 72                 # bytes to reach the return address
win_addr = 0x401176        # address of the win() function
p.sendline(b'A' * offset + p64(win_addr))
p.interactive()

现代防护机制

真实的二进制程序会启用防御机制,以阻止简单的溢出攻击。您必须使用checksec识别这些机制:

  • 栈金丝雀 — 放置在返回地址之前的秘密值;如果该值发生变化,程序就会中止。您必须先将其泄露出来。
  • NX(禁止 eXecute) — 栈不可执行,因此您无法运行放置在其中的外壳代码。
  • ASLR / PIE — 每次运行都会随机化地址,因此您需要先泄露地址,才能确定攻击目标。
  • RELRO — 保护全局偏移表,防止其被覆盖。

每种防护机制都会推动您采用更高级的技术。

面向返回的编程(ROP)

当NX阻止您运行自己的代码时,面向返回的编程会重新利用二进制程序中已有的代码。

您可以将称为代码片段的短指令序列连接起来。每个片段都以ret结尾,从而逐步完成操作,例如加载寄存器并调用库函数来启动命令解释器。您需要在栈上构造这条链,使每个ret都跳转到下一个代码片段。

ROP 是从入门级溢出走向真实世界利用的桥梁;在真实环境中,攻击者的代码很少能直接执行。

格式字符串漏洞

另一种经典的二进制利用原语是格式字符串漏洞:程序将用户输入直接作为打印函数的格式参数传入。

// Vulnerable: user controls the format string
printf(user_input);          // dangerous

// Safe: user input is data, not format
printf("%s", user_input);    // correct

防御者为何要学习这些技术

您学习如何精确利用内存漏洞,正是为了能够防止它们。具体的防御要点如下:

  • 绝不要使用gets或strcpy等无界输入函数;请使用会检查长度的等效函数。
  • 始终启用防护机制:默认开启金丝雀、NX、完整的 ASLR/PIE 以及完整的 RELRO。
  • 在威胁模型允许的情况下,优先使用内存安全语言。
  • 在代码审查中,只要任何用户可控的值到达格式字符串或缓冲区复制操作,就应将其视为严重问题。

快速检查

测试您对逆向和二进制利用基础知识的理解程度。

回顾

现在,您已经掌握了逆向和二进制利用的整体脉络:

  • 在深入分析之前,先使用file、strings和checksec对每个二进制程序进行初筛。
  • 结合静态(反汇编器或反编译器)和动态(调试器)分析来理解程序逻辑。
  • 二进制利用始于覆盖返回地址的栈缓冲区溢出;各种防护机制(金丝雀、NX、ASLR/PIE、RELRO)提高了攻击难度。
  • ROP通过重新利用现有代码片段来绕过 NX;格式字符串漏洞源于不可信的格式参数。
  • 每项技术同时也是一堂防御课,帮助您编写和审查更安全的代码。

接下来,您将构建工具箱并学习如何撰写题解。

免费开始

用 AI 导师学习 Cyber Security Academy — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
76
课程
303

常见问题解答

「逆向工程与 Pwn 基础」课时是免费的吗?

是的 — 「逆向工程与 Pwn 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。

「逆向工程与 Pwn 基础」这节课中我会学到什么?

逆向工程与二进制利用入门。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cyber Security Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「逆向工程与 Pwn 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cyber Security Academy 课中编写并运行代码吗?

能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. CTF 类型与思维方式
  2. Web 与密码学挑战
  3. 逆向工程与 Pwn 基础
  4. 工具与解题报告
← 返回 Cyber Security Academy