花指令
我在做逆向的题目的时候,经常会遇到需要自己将一堆乱码用IDA分析构建成函数,但函数却无法仍然无法使用f5进行编译,就是因为存在花指令的缘故。花指令经常被作为一种手段来增加代码分析的难度。我就打算记录一下几种解决花指令的方法。
手动nop
我们在用IDA用C构建函数时,其实很容易发现花指令,只要将这些花指令NOP掉就可以了。
这个标红的地方很明显就是花指令。
到那个位置,把它NOP掉
main函数就成功出来了
手动不成功的情况就需要具体分析了。
比如这一题**[MoeCTF 2022]chicken_soup**
在这里直接nop掉jmp是没用的,我也不知道具体原因,搜了这一题的WP才知道,当出现jn,jnz时,就代表一定会跳,肯定跳转 下面位置即 C7 45 F8 这里。E9命令会略过,不会执行。所以先用U转换数据再Ctrl+N,nop掉E9, 再F5,就可以了。
函数就出来了
但有些时候,NOP掉之后可能仍然无法F5,但是出现了黄色的代码位置,就直接用C键将黄色区的数字转换成代码就行(全部转完)。
直接用IDA动态调试(有一定几率可以直接出来)
实在找不到花指令的时候可以动态调式试一下。
但是有些时候动态出来的更加准确,这个图中的main函数和上面图中的那一个是同一个函数,很明显,这个更加准确。
用代码来去除花指令
当代码中存在大量花指令时,可以使用IDC代码或者python去解决。
范例
startaddr = 0x1135#起始位置
endaddr = 0x3100#终点位置
这段代码是大佬的
for i in range(startaddr,endaddr):
if get_wide_byte(i) == 0xEB:#需要去除掉花指令
if get_wide_byte(i+1) == 0xFF:
patch_byte(i,0x90)#nop指令的16进制为90h
使用方法
总结
后面遇到更多有关花指令的题目还继续总结的。
参考的博客
1.https://www.cnblogs.com/wgf4242/p/16654971.html
2.https://blog.csdn.net/qq_20031585/article/details/124028238
3.https://www.ctfer.vip/note/set/453