相信刚学习逆向的选手在静态分析的时候会碰到一个棘手的问题,那就是碰到无法将代码反汇编成伪代码,也就是我们常说的花指令,那么接下来我会从十分通俗易懂的角度来解释说明什么是花指令以及如何快速简单的清除花指令。
1、什么是花指令?
一句话概括就是构造一个恒成立条件跳转,并在中间塞一段乱七八糟的数据,下面的一段伪代码会更直观。
if(true){
goto flag1;
}else{
向内存写字节(0xe8); //其实就是call
}
flag1:
当然,花指令是用来欺骗静态分析的,在程序运行时自然会跳转至flag1,但静态分析器(比如IDA)会尝试把每一段代码进行解释,而这里的写入的字节为call(就是调用函数),但是后面没有跟具体参数,反编译器就会将后面的东西当作参数导致反编译失败。
2、如何手动清除花指令?
既然花指令构造时会向内存写入数据,那我们将多余的数据nop掉不就自然能够把花指令清除掉了吗?话不多说,端上一道花指令CTF题进行演示,这里我们只作去除花指令的演示,不作后续算法的逆向。题目==>[HNCTF 2022 WEEK2]e@sy_flower
下载好附件后,直接拖入IDA看看,首先就是f12一波查看字符串定位关键点
跟随
点进去继续跟
到这里就是我们关键函数的主体了,但是这里我们是无法直接f5反汇编的,就是花指令的原因,所以这个时候我们就需要动静结合去动态调试去除花指令,其实仔细看IDA已经把后面的指令全部当成数据了。
打开OD拖入文件运行调试,也先进行中文搜索定位到函数主体
这个时候我们就可以去找哪些是花指令了,只要看je,jnz这类条件跳转指令就OK,然后观察跳转的线是否有终点,如果断了就说明该语句就是花指令,将多余数据nop掉就完成了。
然后看后面的跳转地址是 00C410D5 ,我们发现多了个 00C410D4 地址的数据,直接nop掉即可
接着保存文件即可,再将保存好的文件拖入IDA中
仔细与上图作比较,现在IDA明显已经把这段识别成代码段了(.text),直接f5,大功告成!