花指令,junk code又或者是dirty flower,所以看到关键词就要联想到花指令了
花指令一般分为两种
1,可执行花指令
即添加一些垃圾数据,但不会影响反汇编
2,不可执行花指令
插入一些不完整的指令,会在反汇编的时候报错
反汇编分为两种算法
1,线性扫描法,无法区分代码和数据,将代码段中嵌入的数据误解释为指令,反汇编报错
2,递归下降算法,可以通过构造必然条件或者互补条件,使得反汇编出错
花指令构造形式(ida为递归下降算法)
1,在代码段添加数据,例如0xe8跳转指令,对线性算法造成干扰
2,构造jz和jnz,call以及其他的(一个指向无效数据,另一个指向正常数据,干扰递归)
3,永真条件跳转,构造永真条件,使得某指令必定执行(LoadLraryA函数,MessageBox函数)
4,call&ret指令构造花指令,(call将下一条指令压栈,ret出栈,跳转执行)
如何清除花指令?
个人喜欢手动清除,这边就只讲下手动清除了
例题NSSCTF中的jump_by_jump
进入main函数,发现有一片红,大概率为反汇编错误,光标点到那一行,tap键+空格,转换为汇编语言,如下图所示仔细看,其中又jz和jnz为互补跳转,推测为花指令,仔细看,jz或者jnz最后都是跳转到函数loc_41188c,反汇编也是从这开始出错,推测call里面暗藏花指令,选中call这两行,按d
可以发现有一个db 0E8h,这也是我上文提到的跳转指令,属于花指令,此处选中这一行右击nop即可去除花指令,也可以如下图操作
选中ida上方的options选项,然后再是选择General,打开Stack pointer,将bytes设为5
选中call那一行,右击patching,changebyte
将首项设置为90,也就是nop,即可跳过这个指令的调用,最后选中左侧地址带红的汇编代码,按c重新分析为c语言代码,再按p生成函数,最后选中这些代码, f5即可反汇编成功
最后得到结果如图所示,一道简单的花指令题就做完啦!
总结一下,花指令就是加一些垃圾代码使得反汇编报错,或者是构造jz和jnz以及永恒跳转,跳转到某一处,此处又会暗藏花指令,使得反汇编报错,所以解法就是找出这些垃圾代码,将其nop掉,再按c重新分析,按p生成函数,最后f5即可反汇编成功(本人学识有限,写的不好大佬担待担待,这也仅仅只是花指令的入门,以后再写进阶的^_^)