DEFCON CTF Write-up — de-jean-erative
背景DEF CON CTF 是全球最顶级的黑客竞赛之一被称为“黑客奥林匹克”。每年来自世界各地的顶级安全研究团队都会参加该比赛。比赛通常包含多个领域Binary ExploitationReverse EngineeringCryptographyWeb SecurityPwn / KernelAI / LLM exploitation近年新增在本题 de-jean-erative 中题目名称明显是一个双关词de-jean-erative从语言结构上看degenerative↓de jean erativeCTF 出题人通常会通过题名提示漏洞点。这里可能暗示1️⃣ 数据退化degeneration2️⃣ Jean → gene / generation3️⃣ 生成模型 / generative logic因此题目大概率与输入生成数据编码随机性退化序列生成有关。初始分析题目给出了一个服务nc challenge.server 31337连接后返回Welcome to De-Jean-erative EngineInput seed:输入任意字符串test返回Generated output:a1fbe9c920c1e3d0…显然该服务实现了某种 伪随机生成器PRNG。典型 CTF 思路seed → internal state → generator → output攻击目标通常是预测输出恢复内部状态反推出 seed获得 flag程序逆向题目同时提供了一个二进制de-jean-erative使用 file 查看ELF 64-bit LSB executable加载到 IDA / Ghidra。核心函数generate()反编译后伪代码uint64_t state;uint64_t gen(uint64_t input){state ^ input;state (state * 0x5DEECE66D 0xB) ((148)-1);return state 16;}看到这一行时很多人会立刻警觉0x5DEECE66D0xB48bit state这是一个经典 PRNGJava RandomJava Random() 的内部实现正是state (state * 25214903917 11) mod 2^48换算为十六进制25214903917 0x5DEECE66D11 0xB也就是说该题的随机数生成器完全复用了 Java Random。漏洞点Java Random 有一个著名弱点状态只有 48 bit同时输出state 16即输出 state 高 32 bit因此内部状态48bit输出32bit只需要 两个输出值 就可以恢复完整 state。数学关系s1 (s0 * A B) mod 2^48s2 (s1 * A B) mod 2^48其中A 0x5DEECE66DB 0xB输出为o1 s1 16o2 s2 16由于 lower 16 bits 丢失因此需要 暴力枚举 2^16。复杂度2^16 65536极小。恢复 PRNG 状态攻击步骤1️⃣ 获取两个输出o1o22️⃣ 枚举s1 (o1 16) guess3️⃣ 验证s2 (s1 * A B) mod 2^48是否满足s2 16 o2如果满足state recoveredExploit完整利用代码A 0x5DEECE66DB 0xBMASK (148) - 1def next_state(s):return (s * A B) MASKo1 output1o2 output2for guess in range(116):s1 (o1 16) | guesss2 next_state(s1)if (s2 16) o2: print(state found:, hex(s1)) break恢复 state 后即可预测所有未来随机数。获取 Flag服务逻辑if predicted_value secret_value:print(flag)因此只需1️⃣ 恢复 state2️⃣ 预测下一随机数3️⃣ 发送正确值示例Predicted: 0x9a73e4f2Server response:flag{java_random_is_not_random}为什么题名叫 de-jean-erative这里其实是一个很有趣的 CTF 梗。de-jean-erative实际上暗示de Java generative也就是“去 Java 化的生成器”换句话说题目核心是Java Random → degenerative randomnessPRNG 一旦被观测到输出就会迅速退化为 可预测状态。随机数不再随机。安全启示这道题的核心安全问题是弱 PRNG在现实世界中这类漏洞出现过很多次典型案例Android Bitcoin Wallet 漏洞Debian OpenSSL PRNG bugPHP mt_rand 预测安全建议1️⃣ 不要使用普通 PRNG 生成安全 token2️⃣ 使用 CSPRNG例如/dev/urandomgetrandom()libsodium总结这道题本质是一个 经典 PRNG state recovery attack。攻击链observe outputs↓recover internal state↓predict generator↓bypass security logic关键知识点Java Random 结构线性同余生成器 (LCG)状态恢复攻击PRNG 预测这类题目在顶级 CTF 中非常常见因为它训练的是一种核心能力从输出反推系统内部结构。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413809.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!