花指令
本文简单介绍花指令的原理以及出现原因,只对CTF中出现的花指令情况进行分析以及讲解如何去修复。
解决方案
常见花指令
第一类
花指令特点:调用未知函数。
解决方案:先选中,d(将代码转为数据),然后选中刚刚d的那一行nop掉,然后在下一行,c(转成code)
原理:红色的这一条影响了ida的分析,跳过红色的这一行代码,将下面的数据转成代码
第二类
这其实不能算是花指令,这是花指令对函数带来的影响
解决方案:去除这个endp,选中,edit-->functions-->delete functions,然后选中整个函数,p
原理:花指令的存在导致ida错误判断函数结束,删除整个函数,然后重新选择代码转成函数。
第三类
花指令特点:jmp跳的位置是下一个
解决方案:d,把第一个nop掉,剩下的c
例题
本文所用题目已忘记属于什么比赛,如有侵权,请联系删除
链接: https://pan.baidu.com/s/1JWVnw4RSsNtQcdJ10Vu0Jw 提取码: cuqn--来自百度网盘超级会员v6的分享
例题1
1.查壳,upx壳,脱壳2.
报错,发现jnz跳到了下一条指令,说明这是加花了,把jnz下面的call的第一位(E8) nop掉,然后选中主函数直接转换为函数(p)。
main函数
根据题目这是一个maze题目,adsw控制运动,只需要找出迷宫即可
走迷宫即可
1234567*******+********* ****** **** ******* **F****** **************
迷宫需要自己做一下还原
flag{ssaaasaassdddw}
例题2
进来就是红的,应该是有花指令,往下看看,先改花指令。
在这里,jmp花指令
先U掉jmp,可以确定第一个是混淆的,将第一个nop掉,把剩下的分块转换成code(不要一起选中转换)。
只修出来了个大概,根据case d和case s实现的功能,可以猜测case a和case w实现的功能,应该是不碰到#就一直运动,两个byte_4030正好可以组成迷宫。
123str1 = "#################* # ## ## # ### ## # ### # ## ## # # O#################"for i in range(0,160,16): print(str1[i:i+16])
dsasdwds
flag{f71516bdf07abd7bc0668db9d6352364}
例题3
全是数据,jmp往下跳了一下,肯定有问题,直接nop一字节,然后data转code。
根据硬编码特点,可以发现这个大概给0x1000-0x3000之内做了硬编码,然后每一部分确定范围,使用idapython去跑。
12345678910111213Version:1.0 StartHTML:0000000107 EndHTML:0000002832 StartFragment:0000000556 EndFragment:0000002796from idaapi import * # 设置起始地址和结束地址start_address = 0x1144 # 请将此地址替换为你的实际起始地址end_address = 0x30f8 # 请将此地址替换为你的实际结束地址 # 遍历地址范围内的所有字节for address in range(start_address, end_address,0xd): # 使用IDA API将每个字节替换为NOP指令 (0x90) patch_byte(address, 0x90) print(f"从0x{start_address:X}到0x{end_address:X}的所有字节已替换为NOP指令")
后面能发现很多字符串,里面有flag
Flag:CTF{u_are2wordy}