花指令

本文简单介绍花指令的原理以及出现原因,只对CTF中出现的花指令情况进行分析以及讲解如何去修复。

解决方案

常见花指令

第一类

image-20221020154620283

花指令特点:调用未知函数。

解决方案:先选中,d(将代码转为数据),然后选中刚刚d的那一行nop掉,然后在下一行,c(转成code)

原理:红色的这一条影响了ida的分析,跳过红色的这一行代码,将下面的数据转成代码

第二类

image-20221020154829993

这其实不能算是花指令,这是花指令对函数带来的影响

解决方案:去除这个endp,选中,edit-->functions-->delete functions,然后选中整个函数,p

原理:花指令的存在导致ida错误判断函数结束,删除整个函数,然后重新选择代码转成函数。

第三类

image-20221031191500172

花指令特点:jmp跳的位置是下一个

解决方案:d,把第一个nop掉,剩下的c

例题

本文所用题目已忘记属于什么比赛,如有侵权,请联系删除

链接: https://pan.baidu.com/s/1JWVnw4RSsNtQcdJ10Vu0Jw 提取码: cuqn
--来自百度网盘超级会员v6的分享

例题1

1.查壳,upx壳,脱壳
2.

image-20221012205639464

报错,发现jnz跳到了下一条指令,说明这是加花了,把jnz下面的call的第一位(E8) nop掉,然后选中主函数直接转换为函数(p)。

image-20221012210554566

main函数

image-20221012210650559

根据题目这是一个maze题目,adsw控制运动,只需要找出迷宫即可

image-20221012210803281

走迷宫即可

1
2
3
4
5
6
7
*******+**
******* **
****    **
**   *****
** **F****
**    ****
**********

迷宫需要自己做一下还原

flag{ssaaasaassdddw}

例题2

image-20221031171607471

进来就是红的,应该是有花指令,往下看看,先改花指令。

image-20221031172201201

image-20221031191638253

在这里,jmp花指令

先U掉jmp,可以确定第一个是混淆的,将第一个nop掉,把剩下的分块转换成code(不要一起选中转换)。

image-20221031192349535

只修出来了个大概,根据case d和case s实现的功能,可以猜测case a和case w实现的功能,应该是不碰到#就一直运动,两个byte_4030正好可以组成迷宫。

1
2
3
str1 = "#################*        #    ##              ##    #         ###             ##        #    ###   #          ##              ##    #      # O#################"
for i in range(0,160,16):
    print(str1[i:i+16])

image-20221031191313178

dsasdwds

flag{f71516bdf07abd7bc0668db9d6352364}

例题3

image-20240731171746571

全是数据,jmp往下跳了一下,肯定有问题,直接nop一字节,然后data转code。

image-20240731171855172

根据硬编码特点,可以发现这个大概给0x1000-0x3000之内做了硬编码,然后每一部分确定范围,使用idapython去跑。

1
2
3
4
5
6
7
8
9
10
11
12
13
Version:1.0 StartHTML:0000000107 EndHTML:0000002832 StartFragment:0000000556 EndFragment:0000002796
from 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

image-20240731171159680

Flag:CTF{u_are2wordy}

最新回复:
gameuu 2024-10-12 09:23:20
思路清晰,谢谢分享,要是有相关工具分享就好了。