junk code demo

# 大概是二三月份遇到了一个题出了一个有点意思的花,想着可以看看,对应这种花写了个简单的源码随机加花器。不是什么高深的技术,但是也顺便把 IDA 这类线性扫描反汇编和递归下降反汇编弄清楚点,以后 IDA 抽风的时候也更清楚点为啥

# 原理:

# 来源于 IDAPro 权威指南
线性扫描反汇编

image-20230718011401924

递归下降反汇编

image-20230718011457626

image-20230718011531171

image-20230718011544013

# 这里主要看递归下降反汇编方式
# 首先明确 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 反编译是真喜欢抽风啊。虽然这俩并不是啥必要学的东西,也不难,但是搞清楚一点确确实实在分析很多垃圾二进制汇编的时候有帮助