这是一道代码混淆的题。Dennis Yurichev的开源大作《Reverse Engineering for Beginners》里介绍代码混淆技术的时候提到“made a little attempt to hack Tiny C compiler's codegenerator”。这道题就是这个魔改的 C 编译器,编译出来的。
读者可以在 https://yurichev.com/blog/58/ 这个地址找到介绍和示例。示例代码展示的代码混淆技术,主要是: 1常数替换成一系列的算术求值值令 2插入大量随机指令,将少量有效代码淹没在大量无效指令中
==针对这种混淆技术,其实人工分析只需要抓住关键“字段/数据”(比如函数参数)在内存/寄存器之间流动的方向,进行追踪,就可以较快的识别出正确的代码逻辑。==
这题是一个比较好的学习理解代码混淆技术逆向工程的基础题。
当然就这个题目而言,在示例代码所用的混淆技术上,还有三种混淆技术(或者说技巧更确切一些),本质上可以归为控制流混淆: 3call指令等效替换 4函数 ret 指令的替换 5无效跳转指令(永恒跳转和永恒不跳转) 控制流混淆可以干扰IDA等静态分析工具对代码块的识别,不能自动生成函数。特别是无效跳转指令,跳转地址会破坏顺序分析的某个指令边界,给静态分析工具造成困扰。
随机干扰指令会静态分析工具对栈分配或寻址的分析,阻碍生成更高级别的伪代码。