目录

  1. 1. 前言
  2. 2. 知识点
  3. 3. 题目
  4. 4. 思路
    1. 4.1. 知识补充
      1. 4.1.1. 花指令
      2. 4.1.2. IDA汇编/机械码
      3. 4.1.3. IDApython
    2. 4.2. 操作
  5. 5. 总结

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

RE初探索0x07

2023/4/10 Reverse python 花指令
  |     |   总文章阅读量:

前言

NSS上[GFCTF 2021]wordy

知识点

花指令

ida汇编

python

题目

下载题目附件解压后拖入ida并f5查看

1

发现主函数无法编译,考虑是花指令

思路

知识补充

花指令

实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中,花指令被作为一种手段来增加静态分析的难度,花指令也可以被用在病毒或木马上,通过加入花指令改变程序的特征码,躲避杀软的扫描,从而达到免杀的目的

一般最常见的就是在机器码中加入 E8,E8 加入后会将汇编代码改变为 CALL,而后续的机器码代表的东西是没有意义的,不是一个函数,所以 CALL 之后反编译器无法识别

IDA汇编/机械码

  • jmp

    相应的机器码EB

    绝对跳,无条件跳,从而跳过下面的出错信息

  • nop

    相应的机器码90

    抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处

IDApython

在IDA中File->Script file引入pyhton脚本以执行

startaddr:初始地址

endaddr:结束地址

get_wide_byte()函数:转变为数据(byte)

patch_byte()函数:设置字节值

操作

打开start中的main函数,可见存在大量jmp跳转使程序无法正常编译

2

观察起始地址,结束地址和jmp的机器码

3

4

5

需将EB FF全部换成90,即jmp->nop(将其转换成空指令)

于是编写python脚本在ida中运行

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)

然后一路翻下去可以找到flag的字符

6

GCTF{u_are2wordy}

非预期解

打开hex-view就能找到(

7

总结

初步了解花指令

学习使用IDA python脚本

学习机器码