1. 题目背景与核心挑战解析
这道来自NewStarCTF公开赛赛道的"LCG Revenge"题目,属于典型的密码学逆向分析类CTF赛题。题目基于线性同余生成器(Linear Congruential Generator, LCG)的伪随机数生成机制设计,但相比基础LCG题目增加了多层嵌套和参数隐藏的复杂度。
LCG作为伪随机数生成算法,其基本公式为:
code复制Xₙ₊₁ = (a * Xₙ + c) mod m
其中:
- Xₙ 是当前状态值
- a 是乘数(multiplier)
- c 是增量(increment)
- m 是模数(modulus)
本题的特殊性在于:
- 采用了三重LCG嵌套结构
- 关键参数a、c、m被隐藏在二进制文件的特定内存区域
- 需要先通过逆向分析提取参数,再破解生成的伪随机序列
- 最终flag被伪随机数异或加密存储
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆向工程与参数提取实战
2.1 文件分析与初步逆向
使用file命令检查题目文件:
bash复制$ file lcg_revenge
lcg_revenge: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, stripped
关键发现:
- 64位ELF文件
- 动态链接
- 已去除符号表(stripped)
使用Ghidra进行反编译,定位到main函数后,发现核心逻辑在generate_sequence函数中。通过交叉引用分析,找到三个关键内存区域存储着LCG参数:
code复制0x555555558040: a1, c1, m1
0x555555558060: a2, c2, m2
0x555555558080: a3, c3, m3
2.2 动态调试获取参数
使用GDB附加调试,在generate_sequence函数设置断点:
bash复制gdb-peda$ b *generate_sequence+0x45
gdb-peda$ run
