@TOC

前言

花指令都是在比赛中经常碰见,已经属于老掉牙的东西了,现在回过头来总结总结,一定会有不一样的收获

花指令

花指令是一种静态混淆的手段,在我们静态分析时,会出现各种ida f5报错的问题,并且代码看起来十分混乱,无论是对于ida这种递归下降扫描,还是od那种线性扫描都会起到一定的阻碍的效果。
但不管怎么样,代码运行起来的时候,总会无差错的执行。

常见花指令

1

最常见的花指令就是在代码中 插入了E9这个机器码,E9 在汇编中对应着jmp指令,当ida读到E9时,会默认把后面四个字节作为地址,如果前面的代码里刚好有jmp之类的跳转指令跳到这里就会发生错误
在这里插入图片描述
类似的还有 E8 (call指令),也会把后面四个作为地址来使用

这种花指令的去除,就是把报错的地址 d 变成数据,把无用的数据nop掉,剩下的 c重新汇编就行

2

不管怎么都跳的指令
在这里插入图片描述在这里插入图片描述这种就直接把中间的没有的数据全部nop

3

call ret花指令

中间插入的垃圾数据会直接跳过
在这里插入图片描述
这种要分析其流程 patch掉合适的内容

4

栈帧出错的问题

代码有时候 会把rsp乱加减一个大数,就会出现栈帧报错的问题,类似这种
在这里插入图片描述
直接nop掉即可,
其他的情况,可以打开ida的栈帧分析,要保证函数退出的时候栈帧平衡即可
(alt+k)处理

5

一直用jmp或其他跳转指令跳,中级偶尔插入一个有用的指令,这种花指令就十分的烦人
,要么你就一个一个的分析,会很耗费时间。
在ctfwiki上提供了这种画质令的解决办法,就是利用od的run跟踪,它可以告诉你什么指令执行了,什么指令没执行,非常好用。
在这里插入图片描述
在这里插入图片描述
类似的还有unicorn模拟执行,可以帮助我们分析出哪些指令执行过,哪些没有执行过