ARTICLE DETAIL

资讯详情

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

rveng 逆向工程教学法研究:从“求解后揭示“循环到三类机器可判定答案规范的落地实现

rveng 逆向工程教学法研究:从“求解后揭示“循环到三类机器可判定答案规范的落地实现 【免费下载链接】Cybersecurity-ProjectsBuilding 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 项目地址https://gitcode.com/gh_mirrors/cy/Cybersecurity-Projects点击查看免费下载本篇技术指南围绕 rvengReverse-Engineering Platform的教学法研究文档展开深入剖析其核心的solve-then-reveal先求解、后揭示教学闭环以及支撑该闭环的三类机器可判定答案规范found-value、identified-symbol、patched-bytes。你将看到从教学理念、模块映射、判分规则到 Python 引擎与测试代码的完整实现链路并掌握如何设计可被机器批改的逆向工程闯关题。一、为什么要让平台来批改而不是发工具rveng 的设计来源是前代逆向工程教学平台的模式给学习者一份编译好的二进制文件、一句任务描述找出魔法数字学习者使用工具如今是浏览器内的十六进制查看器、反汇编器、字符串扫描器解答问题。前代平台无法验证答案是否正确——它只能信任学习者自己说我做对了。rveng 的突破在于把同样的教学循环升级为一个可机器批改的系统。学习者必须先从二进制本身得出答案平台在揭示答案之前验证其正确性只有提交正确后才揭示原始 C 源码让学习者把机器级证据和产生它的代码对应起来。正如研究文档 03-pedagogy.md 所指出的仅在正确答案之后揭示源码正是这个循环之所以能教学的原因Revealing source only after a correct answer is what makes the loop teach。这个设计的前提是每个挑战都必须有一个机器可判定的答案。这正是下文三类答案规范存在的意义。二、solve-then-reveal 教学循环研究文档给出的循环共四步rveng 完整保留一个模块通过一段简短的概念笔记教授一项技能一个挑战提供编译好的二进制文件和一个任务如 find the magic number学习者使用工具现在全部在浏览器内完成解决它解决之后原始 C 源码被揭示学习者将机器级证据与产生它的代码联系起来。这四步中答案可检查是循环成立的关键。因为每道题都有一个机器可判定的答案平台才能做到先判分、后揭示从而真正替代信任学习者的旧模式。三、三类答案规范verifier 必须批改的目标研究文档指出全部五个模块的答案可以归纳为三类且每一类都能在示例二进制gate上找到具体实例。在引擎侧这三类被建模为 challenge.py 中的三个 dataclass3.1 found-value定位二进制中的值学习者在二进制中定位一个值并提交它。例如check()中的魔法数字0x539十进制 1337它源自指令cmp DWORD PTR [rbp-0x4],0x539。验证器接受十进制或十六进制形式的提交并在比较前做归一化。此类还覆盖字符串.rodata偏移 0x402004 处的the_flag_is_here或一个偏移量。对应的实际挑战可见 01-read-the-hex/challenge.json任务为在只读数据中找到隐藏字符串the_flag_is_here答案规范为{category: found_value, expected: the_flag_is_here}。3.2 identified-symbol命名函数、节或符号学习者说出一个函数、节或符号的名字。例如哪个函数决定了结果答案是check位于 0x401146.symtab中大小为 30 字节。验证器将提交与已知符号名进行大小写不敏感的比较。对应的挑战是 04-name-the-function/challenge.json答案规范为{category: identified_symbol, name: check}。3.3 patched-bytes修改字节以改变行为学习者修改字节改变程序行为并提交被修改的字节区间。示例翻转门控将 0x401154 处的jne操作码75改为始终走解锁路径。验证器对提交的补丁和已知正确的补丁目标做静态字节差分diff从不运行结果。对应的挑战是 03-flip-the-gate/challenge.json任务要求把文件偏移 0x1154 处的jne75 07patch 为9090使分支永不成立、解锁路径始终执行答案规范为{category: patched_bytes, offset: 4436, patch: 9090}。四、模块到答案类别的映射研究文档用一张表概括了五个模块与答案类别的对应关系#模块技能答案类别01hex-reading阅读十六进制转储、定位数值found-value02elf-anatomy头部、节、入口点found-value / identified-symbol03patching修改字节、改变行为patched-bytes04strings-symbols查找名称与字符串found-value / identified-symbol05disassembly阅读汇编、找到门控found-value在仓库中这张表与 challenges 目录下的六个挑战一一对应其中模块 02 和 04 各有一个挑战采用其中一种类别模块 05 还额外提供了剥离符号的变体01-read-the-hexhex-readingfound-value字符串the_flag_is_here02-find-the-entryelf-anatomyfound-valuee_entry字段答案 4198496 0x40106003-flip-the-gatepatchingpatched-bytes909004-name-the-functionstrings-symbolsidentified-symbolcheck05-find-the-gatedisassemblyfound-value数字 133706-stripped-gatedisassembly无符号表变体found-value数字 1337。五、每个模块什么样的挑战才是好挑战研究文档按模块给出了设计准则这些准则直接转化为上面六个挑战的任务描述hex-reading在可找到的偏移处十六进制转储中可见一个数值或 ASCII 字符串。学习者练习读取偏移量和 ASCII gutter右侧可打印字符列。elf-anatomy答案是一个头部字段或节的事实入口点、哪个节容纳某个字符串、有多少个节。教的是文件的骨架结构。挑战 02-find-the-entry 让学习者直接读 ELF 头的e_entry字段。patching一个条件跳转或比较门控着行为一到几个字节的修改即可改变结果。教的是行为即字节。挑战 03-flip-the-gate 正是把jne75 07替换为90 90两条 NOP使jne永不触发、解锁路径始终执行。strings-symbols无需反汇编即可从.rodata或.symtab恢复出密码或函数名。教的是先捡便宜再啃硬骨头。挑战 01-read-the-hex 与 04-name-the-function 即分别对应字符串和符号名。disassembly符号可能被剥离学习者必须直接读懂cmp/条件跳转门控。教的是当名字消失后汇编就是最终真相。挑战 06-stripped-gate 明确说明没有符号表需要学习者通过函数序言prologue发现函数、反汇编、读出比较的常量。六、判分规则及其源码实现研究文档给出了三类答案的判分规则全部在 challenge.py 中落实6.1 found-value 判分数值型双方都归一化为整数接受0x539、539h、1337三种写法字符串型去空白并转小写后精确匹配。实现上normalize_int()challenge.py#L91-L102先strip().lower()再依次识别0x前缀、h后缀和纯十进制_grade_found_value()challenge.py#L105-L111对数值走normalize_int比较对字符串走strip().lower()精确比较。测试 test_challenge.py#L23-L46 验证了这些规则0x539、539h、 1337 都归一化为 1337正确答案会揭示源码revealed_source SOURCE错误答案则revealed_source is None。此外 test_robustness.py#L79-L84 特别验证了13 37这类带空格提交不会被拼合成匹配防止输入歧义。6.2 identified-symbol 判分去空白并转小写后与已知名字精确比较大小写不敏感。实现见 challenge.py#L114-L116测试 test_challenge.py#L49-L53 验证了Check能匹配check而main不能。6.3 patched-bytes 判分提交的字节在指定偏移处应用到原始二进制后必须与已知正确的补丁目标在静态字节差分下完全一致绝不执行。实现分三层patch.py 的diff()对等长缓冲区逐字节比较并返回ByteDiff列表长度不一致则抛PatchErrorapply()在越界时同样抛PatchErrorverify_patch()patch.py#L50-L61将提交字节应用到原二进制并与known_good比较任何异常返回Falsegrade()对PatchedBytes分支将字符串提交按 hex 解析为字节bytes.fromhex失败时返回 invalid patch bytes 的错误结果绝不崩溃。测试证据 test_patch.py#L42-L47 验证NOP_NOP90 90能通过verify_patch而原字节75 07不能test_patch.py#L50-L55 进一步用补丁后的镜像重新反汇编check函数断言其中不再有任何条件分支指令test_challenge.py#L63-L69 验证了grade()对b\x90\x90与9090两种提交形式均判对test_robustness.py#L49-L58 则用zz、909、0xff等非法 hex 输入确认系统不崩溃且保持correct is False。七、判分与源码揭示的联动grade() 的统一入口所有类别的判分最终汇入grade(challenge, submission)challenge.py#L127-L148对FoundValue、IdentifiedSymbol提交先经_as_text()解码为文本对PatchedBytes提交经_as_bytes()转为字节判定正确时返回GradeResult(True, correct, challenge.source)——此时才把源码随结果一起返回判定错误时返回GradeResult(False, not correct yet, None)——源码继续保持隐藏。这正好实现研究文档强调的核心教学语义揭示必须排在正确提交之后而这一排序之所以可行正是因为每个答案都是机器可判定的。GradeResult.revealed_source字段challenge.py#L80-L88就是先判分、后揭示这一教学契约在代码层的直接体现前端 SourceReveal.tsx 则负责在拿到该字段后展示源码。八、对抗性核查确认的关键事实研究文档记录了对真实二进制gate的对抗性核查adversarial check结论这些结论正是示例挑战的判分基准魔法数字是0x539十进制 1337决定结果的函数是位于 0x401146 的check门控是位于 0x401154 的jne。这些事实在仓库中有多重印证。索引文档 docs/research/INDEX.md 汇总了更多经原始字节交叉验证的细节入口0x401060、e_shoff 0x36a013984、e_shnum 30、e_ident 7f 45 4c 46 02 01 01check位于0x401146大小 30cmp ...,0x539在0x40114d门控jne在0x401154秘密字符串the_flag_is_here在.rodata 0x402004。同时它强调一个贯穿始终的诚实约束引擎只读取字节、从不执行它们这决定了web 应用吞二进制仍然安全。测试侧同样锁死了这些事实test_robustness.py#L87-L94 用指令字节817dfc390500007507在 0x40114D 处反汇编验证cmp的 immediate 是0x539、jne的 immediate 为None而 branch_target 是0x40115Dtest_patch.py#L38-L39 直接从gate二进制文件中读取 0x1154 处的两个字节确认就是75 07。这些对应关系同样可见于引擎的find_gate()disasm.py#L160-L167它返回第一条带立即数的比较指令——这正是挑战 05/06 的自动判分锚点。九、从教学法到平台的工程落地路径研究文档 INDEX.md 说明了该文档对应的实现目标engine/challenge.py与挑战运行器。若你希望自行搭建类似的平台推荐的落地路径是理解gate样本查看 tests/fixtures/gate.c——一个只有check()/main()的迷你程序check(1337)才返回 1是全部六个挑战共用的样本配套的剥离版本gate_stripped用于挑战 06 的函数发现。读实现src/rveng/engine 下的模块分工清晰——elf.py手写解析 ELF64 头、节表、符号表disasm.py用 capstone 解码 x86-64 并标注比较指令、条件跳转与 RIP 相对引用hex.py生成带 ASCII gutter 的转储strings.py提取可打印串discover.py通过扫描55 48 89 e5标准序言发现剥离二进制中的函数patch.py提供静态差分与补丁应用challenge.py承载三类答案规范与统一判分入口。跑测试just test等价于uv run pytest -q参见 justfile 与 README.md观察 tests/test_challenge.py 和 tests/test_patch.py 如何以测试形式固化上述教学契约。运行平台just up将引擎镜像与 React 应用构建并服务于 http://localhost:8790生产栈just dev-up提供热重载开发栈于 :8791生产环境由 nginx 托管前端并代理/api到 FastAPI 容器compose.yml。十、总结rveng 的教学法核心可以凝练为一句话先求解、后揭示只有建立在机器可判定答案之上才能成立。三类答案规范found-value、identified-symbol、patched-bytes把主观的我答对了变成可验证的字节级事实而静态判分与绝不执行的底线详见研究文档 04-no-execution-posture.md让平台在保持安全的同时真正承担起批改老师的角色。无论是设计新的逆向工程课程还是为已有的教学工具增加自动判分能力这套模块 → 答案类别 → 判分规则 → 源码揭示的链路都是一份可直接复用的工程蓝图。赞分享【免费下载链接】Cybersecurity-ProjectsBuilding 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 项目地址https://gitcode.com/gh_mirrors/cy/Cybersecurity-Projects点击查看免费下载相关推荐rveng 逆向工程引擎实现剖析从 ELF 解析到求解后揭示的无执行式二进制分析rveng 逆向工程引擎实现剖析从 ELF 解析到求解后揭示的无执行式二进制分析 导读 本篇以 rveng 项目的学习文档 learn/03 IMPLEMENPlate 数学定界符触发器规范研究$...$ 与 $$...$$ 打字触发从语料考证到实现落地Plate 数学定界符触发器规范研究 $...$ 与 $$...$$ 打字触发从语料考证到实现落地 导读 本文基于 Plate 仓库中 docs/plans/前端富文本UI组件终极指南如何用pop框架彻底解决iOS动画卡顿问题终极指南如何用pop框架彻底解决iOS动画卡顿问题 pop是一款功能强大的iOS、tvOS和OS X动画引擎它不仅支持基本的静态动画还提供了弹簧和衰减等动人工智能计算机视觉物联网智能家居后端嵌入式上一篇DLRS社区贡献指南如何参与开源项目并提升你的Salesforce技能下一篇Arbre性能优化10个提升HTML渲染速度的最佳实践 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表