什么是花指令
花指令(junk code)是一种混淆静态分析的手段,类型大体分为两种:不会被执行的花指令和会被执行的花指令
花指令类型
类型一:操作码污染
这类花指令被插入正常代码中,用来迷惑反编译器,但是不会被实际执行。这里简单举个例子:
在一个输出helloworld的代码中使用内联汇编直接插入操作码,其中的0x33是xor指令的操作码,这样可以起到迷惑反编译器的作用,用ida试试看
但是在编译过程中编译器会自动优化代码,高版本IDA有一定的反混淆功能,这样可能会把花指令给优化了
类型二:破坏堆栈平衡
上面是通过操作码污染(0x33模拟xor指令)来构成花指令,还有一种比较常见的不被执行的花指令
这里先清空eax寄存器里的值,然后直接修改栈指针,这里可以看到在visual studio调试中报错堆栈不平衡了,编译后用IDA看看emmm,按理说这样做应该会导致不能查看伪代码,但是这里可以正常查看(可能是9.0版本的IDA有纠错能力吧),但是还是可以看到在汇编语言界面出现了bp栈指针模糊的提示
类型三:构造冗余操作
这次在代码中间插入了一段代码,push eax会减少esp4字节,紧接着add esp, 4又恢复esp,这种压入栈后立马弹出的操作虽然不会对主程序造成影响,但是可以起到迷惑IDA的作用
用IDA打开也是发现了栈指针模糊的情况
例题
basectf2024 Basere
拿到附件先查壳没壳用IDA看看,进来就爆红,而且这段还不能看伪代码
还发现调试不了,一调试就闪退,猜测有反调试
接下来先静态分析,先处理花指令,发现了jz和jnz,一个为0跳转,一个非0跳转,这两个是条件互补花指令的标志,放大看
因为存在两个条件互补跳转,会跳转到下面的mov指令,所以需要把mov指令nop掉,这里使用edit里的patch program/Change Byte来调整
这里的89代表的是mov指令,将其修改为90(代表nop指令)就可以恢复了
这里就修好了,修好后用Ctrl+p标记为函数,就可以查看伪代码了;再打开shift+F12查看
发现base64码表,跳转过去发现存在交叉引用,顺着找过去,发现还有一处花指令
一样的操作nop掉,发现start函数伪代码变多了,而且出现了主调函数
追踪过去发现了密文,于是直接去搓,发现不太对,可能在nop的时候漏了关键信息,既然看到了码表,那么就有理由怀疑可能存在base64换表,尝试动调,前面也说过,存在反调试
果然发现了TLS函数,但是不太会绕过,就尝试纯静态分析了
后面也是在一直交叉引用中找到了这个加密函数,就是将标准表和表长进行比较,然后进行计算,计算后交换结果,最后得到换的表后就可以解了