ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

逆向入门实战:ctf-tasks Memory 挑战的 UPX 脱壳与虚拟机还原教程

逆向入门实战:ctf-tasks Memory 挑战的 UPX 脱壳与虚拟机还原教程 逆向入门实战ctf-tasks Memory 挑战的 UPX 脱壳与虚拟机还原教程【免费下载链接】ctf-tasksAn archive of low-level CTF challenges developed over the years项目地址: https://gitcode.com/gh_mirrors/ct/ctf-tasksctf-tasks 是一个收录了 Dragon Sector 战队历年低层 CTF 挑战的归档仓库其中MemoryCONFidence CTF 2014逆向工程Windows x8650 分是极佳的逆向入门练习它同时涉及UPX 脱壳与虚拟机还原两大经典技能当年仅 2/11 支队伍解出。本文将以它为教材带你走完从加壳二进制到还原虚拟机的完整逆向流程。Memory 挑战简介为什么适合逆向入门️Memory 的题目描述只有一句话Destruction is key破坏是关键暗示了解题的核心线索藏在程序的析构函数destructor中。它的难度被作者标记为 easy但涉及的知识点非常全面知识点说明难度文件格式识别识别 PE 文件与加壳特征⭐UPX 脱壳修复损坏的壳并解压⭐⭐虚拟机逆向分析自定义 VM 指令集⭐⭐⭐算法逆推/爆破恢复期望输入⭐⭐题目文件位于task/目录下的memory_re50.exe而官方解题脚本与脱壳产物保存在solution/目录中非常适合对照学习。逆向环境准备需要哪些工具在开始逆向之前先准备好常用工具二进制查看工具strings、xxd/ HxDWindowsPE 分析工具Detect It EasyDIE、PEiDUPX 官方工具upx命令行脱壳用反汇编工具IDA Pro 或 Ghidra脚本环境Python题目自带disasm.py、recover_key.py都是 Python 脚本第一步识别 UPX 加壳特征 对题目文件task/memory_re50.exe运行strings命令很快就能发现线索UPX! 3.91UPX!魔数是最直观的 UPX 加壳标志同时文件中还能看到压缩节区名。这一眼就能判断目标程序使用了UPX 压缩壳需要先脱壳才能看到真实逻辑。 顺带一提程序运行时打印的提示Flag: -. --- .--. .其实是摩尔斯电码解码后是 NOPE——作者用假 flag 提醒你直接运行拿不到真正的答案第二步UPX 脱壳实战修复损坏的壳通常 UPX 壳可以用官方工具一行命令解开upx -d memory_re50.exe但这里有个小坑题目故意对 UPX 文件做了轻微损坏直接脱壳会报错。解决办法是把原始文件task/memory_re50.exe与修复后的solution/memory_re50_upx.exe做二进制对比找出被篡改的字节并还原。修复成功后再次执行upx -d即可得到脱壳产物unpacked.exe与solution/unpacked.exe一致。脱壳后文件从 7168 字节膨胀到 13312 字节真实代码完全暴露出来逆向之旅正式开始第三步发现虚拟机VM结构 用 IDA 或 Ghidra 打开脱壳后的unpacked.exe会看到一个奇怪的字节数组从文件偏移0x1440开始是一段按固定 8 字节一条排列的数据。每条指令的格式为偏移长度含义04 字节操作码小端序41 字节缓冲区索引51 字节立即数参数这正是题目作者实现的自定义虚拟机——程序先把用户输入读入一个 20 字节的缓冲区再交给这段字节码程序逐条执行。逆向虚拟机还原的第一步就是搞清每条指令的含义。第四步逆向 VM 指令集虚拟机还原核心⚙️官方脚本solution/disasm.py给出了指令集的完整映射一共有 6 条指令操作码指令含义0add缓冲区[idx] arg1sub缓冲区[idx] - arg2xor缓冲区[idx] ^ arg3neg缓冲区[idx] ~缓冲区[idx]4cmp比较占位不修改数据5exit终止 VM 执行运行python disasm.py即可把0x1440处的字节码反汇编成人类可读的指令序列例如[00001440] add [ 0], 0x30 [00001448] xor [ 0], 0x4f [00001450] neg [ 1] ...经过全部运算后VM 会检查缓冲区中的每个字节是否与期望值表匹配。这个过程正向执行逻辑清晰但如果要手工逆推 20 个字节的原始输入工作量不小。第五步爆破恢复输入 key 好在题目作者贴心地提供了更省力的解法solution/recover_key.py采用了逐字节爆破策略——对每个可能的字符0x20 到 0x7f 的可打印 ASCII用一个全为该字符的 20 字节缓冲区运行 VM凡是最终结果与期望值表EXPECTED_BUFFER对应位置吻合的字符就记入 key 的该位。EXPECTED_BUFFER [0xd4, 0x00, 0xee, 0x9a, 0xac, ...] for c in range(0x20, 0x7f): buffer [c] * 20 RunVM(program, buffer) # 比对并逐步填充 key这种单字节独立爆破思路成立的前提是每条指令只操作一个确定的缓冲区下标互不影响——这正是逆向中值得反复体会的优化思维。运行脚本即可看到 20 个字符逐步浮现的动画效果。第六步在析构函数中拿到真正的 flag 输入正确的 key 后程序才进入正题真正的 flag 并非写死在程序中而是在一个析构函数里于内存中实时构造出来。这正是题目描述 Destruction is key 的含义——破坏析构才是关键在调试器中下断点观察析构流程或在内存中搜索构造出的字符串就能找到最终答案。这个设计堪称精妙静态分析时你只能看到假 flag只有真正运行程序并满足 VM 校验才能在内存里捕获真实 flag。复盘与收获逆向入门的三个要点 加壳识别是第一步看到UPX!魔数就要想到脱壳遇到损坏的壳对比修复后的文件是常见技巧。虚拟机还原讲究结构化先定指令格式操作码 操作数再逐个语义分析最后写反汇编脚本solution/disasm.py就是极简范例。爆破是逆向的好朋友当正向逆推复杂时利用指令互不影响的独立性做逐字节爆破往往事半功倍solution/recover_key.py值得收藏。如果想亲自动手练习可以用以下命令获取完整题目与解题脚本git clone https://gitcode.com/gh_mirrors/ct/ctf-tasks挑战文件与代码都位于CONFidence CTF 2014/Main event/Memory/目录下加壳题目在task/memory_re50.exe脱壳产物、反汇编脚本solution/disasm.py与 key 恢复脚本solution/recover_key.py都在solution/中对照学习效果更佳。掌握 Memory 这一题你就同时点亮了 UPX 脱壳、虚拟机逆向与爆破恢复三大入门技能为更复杂的混淆与壳对抗打下坚实基础【免费下载链接】ctf-tasksAn archive of low-level CTF challenges developed over the years项目地址: https://gitcode.com/gh_mirrors/ct/ctf-tasks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表