junk code demo Posted on 2023-07-18 # 大概是二三月份遇到了一个题出了一个有点意思的花,想着可以看看,对应这种花写了个简单的源码随机加花器。不是什么高深的技术,但是也顺便把 IDA 这类线性扫描反汇编和递归下降反汇编弄清楚点,以后 IDA 抽风的时候也更清楚点为啥 # 原理: # 来源于 IDAPro 权威指南 线性扫描反汇编 递归下降反汇编 # 这里主要看递归下降反汇编方式 # 首先明确 IDAPro 的反汇编均为静态进行。根据条件分支指令可以构造入门的 junk instructions 如 (jz+jnz) 或者永真 / 假条件 + jz/jnz 类型(注意:后者在构造时需要考虑编译器优化问题) # 实际上,根据上面这个跳转问题,就可以构造一种花,在虚假的控制流中间加入诸如破坏栈帧的 junk code,导致反编译失败。不过实践应该是没什么用的,毕竟去虚假控制流的最常见思路就是模拟动态执行,顺带就把花拿下了:) # 如果能理解这个最基本的例子原理,大概可以找到一种构造反汇编的通式: 用构造永真条件跳转逻辑,在产生的虚假的控制流中塞入junk code,使得反汇编失效 # 然后,配合一些小小的汇编知识,就可以产生奇妙的效果 # 例如,call 指令正常情况下不会指向其他 call retn 间的地址,但通过 asm 汇编内联,可以让 call 指向一个最近的相对地址,同时__不维护条件寄存器__,通过该条件寄存器控制永真逻辑。当调用 retn 的时候返回 call,下面的条件寄存器会重复修改。中间的代码在 IDA 优化过程中是假逻辑,但构造运行两次后变为永真。([可能有点抽象,这里写了个小 demo](junkCode/README.md at main · DeMoYao100/junkCode (github.com)) # 其实基本上看懂这个 demo,就能搞明白上面这个通式了,这里修改寄存器、或者其它构造虚假控制流的方法可就多种多样了(疑似是之前看过构造 rop 链劫持控制流的题,无心之举导致的反编译失效)也没必要深究,遇到之后再分析就行 # 然后是函数指针篡改,感觉一出现 ida 很容易抽风,基本上就是动调的时候修就行(除非恶意构造) # 最后立个 flag,有空把 IDA 反编译也写一篇 ida 反编译是真喜欢抽风啊。虽然这俩并不是啥必要学的东西,也不难,但是搞清楚一点确确实实在分析很多垃圾二进制汇编的时候有帮助