玄机靶场-第十八届CISCN决赛 CTF-MiracleStruct WP
玄机靶场-第十八届CISCN决赛 CTF-MiracleStruct WP极难级别的 REVERSE 题只有一个 Flag考察对 Windows PE 结构体逆向的深度理解结合多层分段校验逻辑和自定义加密算法。1. 题目背景与附件分析题目描述是一句意味深长的话“The StructYour life itself is a miracle bestowed by the C”暗示核心考点就是 C 语言结构体的逆向。附件解压后得到两个文件MiracleStruct.exe (1.8MB, PE32 x86-64 控制台程序) miracle.dll (2.7MB, PE32 x86-64 DLL)运行MiracleStruct.exe后程序会弹出提示Please input a string (regex: .*\{([^\}]{1,36})\}):说明程序接受flag{...}格式的输入并对花括号内的内容进行校验长度限制在 1~36 个字符之间。2. 静态分析miracle.dll 导出函数梳理用pefile分析miracle.dll的导出表发现共有20 个导出函数可以分为三类核心控制函数ordinal 1-4函数名RVA作用CheckFlagEntryPoint0x3330主校验入口调度所有分段校验Decode1EntryPoint0x3760解码函数1AES/自定义块加密Decode2EntryPoint0x25e0解码函数2流加密/XORInitEntryPoint0x22a0初始化构建256个结构体节点分段校验函数ordinal 8-18共9个_CHECKxxx这9个函数名称故意混淆大小写如_CHECKfIaghDeNTRYP0INT、_CHEckFl4GHDEN7ryPO1nT每个函数负责校验 flag 内容的一个片段通过不同的数学变换模运算、位移、异或来验证。分割函数ordinal 5-7, 14-16, 19-20共7个_SPLITxxx这些函数负责将输入的 flag 字符串按照特定规则切分成多个子串再分别传给对应的_CHECKxxx函数。3. 动态分析InitEntryPoint 初始化逻辑InitEntryPoint在程序启动时被调用核心逻辑是一个循环 256 次的初始化过程mov ecx, 0x18 ; 分配 0x18 字节的结构体 call malloc mov [ripg_struct_arr], rax ; 保存到全局结构体数组 ; 循环 0x100 次 mov dword ptr [rsp0x20], 0 loop: cmp dword ptr [rsp0x20], 0x100 jge done ; 为每个节点填充函数指针和数据 ... inc dword ptr [rsp0x20] jmp loop这里构建了一个包含 256 个节点的结构体数组每个节点大小为 0x18 字节24 bytes包含0x00函数指针指向某个校验子函数0x08数据指针指向对应的常量数据0x10索引/长度字段4. 逆向分析CheckFlagEntryPoint 校验流程CheckFlagEntryPoint是整个题目的核心其逻辑如下读取输入通过scanf读取用户输入的 flag 字符串用正则提取花括号内的内容。调用_sPl1tFlagen7RYP01nt将 flag 内容按照-分隔符切分成多个 UUID 格式的子串xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。逐段校验依次调用9个_CHECKxxx函数每个函数对对应子串进行校验将子串转换为字节数组通过Decode1EntryPoint或Decode2EntryPoint进行解密将解密结果与预置的常量数据进行比对全部通过则输出Your Get Flag!否则输出[%s] Input failed校验算法核心是一个基于 C 结构体的状态机每个结构体节点存储了一个期望值解密后的字节必须与之完全匹配。5. 提取 Flag通过对Decode1EntryPoint和Decode2EntryPoint的逆向分析以及对9个_CHECKxxx函数中预置常量数据的提取最终还原出完整的 flagflag{492b3b8e-59b9-4d9b-bbc9-1326b9fe40f0}这是一个标准的 UUID v4 格式字符串由5段十六进制数字组成分别对应5个不同的校验函数的验证结果。总结这道题的核心是对 Windows DLL 中多层分段校验逻辑的逆向分析。攻击者解题者需要识别出miracle.dll的导出函数结构理解分割-校验的两层架构逆向InitEntryPoint中的结构体初始化逻辑还原256个节点的数据逆向Decode1/2EntryPoint中的解密算法反向推导出正确的输入将9段校验的结果拼接成完整的 UUID 格式 flag。题目名称MiracleStruct正是点题整道题的精髓在于那个由 C 结构体构建的、包含256个节点的校验状态机。Flag 汇总步骤内容Flag1逆向 miracle.dll 分段校验逻辑还原完整 flagflag{492b3b8e-59b9-4d9b-bbc9-1326b9fe40f0}