reserve学习笔记(花指令)

这是闲来无事逛博客时看到的一篇相关文章,觉得挺有意思。

定义

首先花指令其实就是没有用的指令(垃圾指令),它穿插在真正的代码中,会导致反编译时出现问题,从而会影响我们的静态分析

分类以及讲解

花指令分为两种,其中一种为可执行花指令,另一种为不可执行花指令。

可执行花指令:顾名思义,就是该指令可以执行,但是执行后的结果是没有意义的,不会对寄存器的值产生任何影响,它仅仅是为了增加逆向工程师的工作量。

不可执行花指令:在可执行的代码中插入看似正常的代码,然而这些代码是永远不会被执行的,他会干扰反编译器的运行

垃圾数据必须是某个合法指令的一部分,简单来说,花指令不能是完全随机的乱码,而是要看起来像是正常的指令片段。这是因为反编译器和反汇编器在分析代码时,会按照指令的格式去解析字节。如果花指令是随机的乱码,它们很容易就能识别出来并忽略掉。但如果花指令看起来像是合法指令的一部分,反编译器就会被误导,尝试去解析这些无意义的代码,从而出错。

程序运行时,花指令必须位于实际不可执行的代码路径,这意味着花指令插入的位置很重要。它必须是在程序正常运行时永远不会被执行的代码路径上。换句话说,这些花指令虽然存在,但在程序真正运行时,它们不会被CPU执行,不会影响程序的正常功能。

原理

  1. 反汇编算法的两种类型

(1)线性扫描算法

想象你有一本书,书里全是用机器语言写的代码。线性扫描算法就像是从书的第一页开始,逐字逐句地读下去,把每个字节都当作指令来解析。

工作原理:从程序的入口点(也就是程序开始的地方)开始,一条指令一条指令地反汇编,就像按顺序读书一样。

问题:在计算机的世界里,代码和数据是混在一起的(这就是冯·诺依曼体系结构的特点)。线性扫描算法不会区分哪些是代码,哪些是数据,所以它可能会把数据误当作指令来解析。这就像是把书里的标点符号也当作句子来读,结果就会乱七八糟,得到错误的反汇编结果。

(2)递归下降算法

递归下降算法则更聪明一些。它不仅会按顺序读代码,还会关注代码的逻辑结构,也就是"控制流"。控制流可以理解为程序运行时的路径,比如程序可能会根据条件跳到不同的地方执行。

工作原理:它从程序的入口点开始,遇到正常的指令就按顺序反汇编。但如果遇到"跳转"指令(比如"如果条件满足,跳到第10行执行"),它就会跳到那个位置,从那里开始继续反汇编。这样可以更好地理解程序的逻辑结构。

问题:递归下降算法依赖于程序的控制流,但如果有人故意在代码中插入一些虚假的控制流(比如构造一些看起来像是跳转指令,但实际上不会被执行的指令),它就会被误导,从而反汇编出错。

  1. 花指令如何利用这些缺陷

(1)针对线性扫描算法

花指令可以插入一些看似是指令,但实际上不是指令的数据。因为线性扫描算法不会区分代码和数据,所以它会把这些花指令当作正常的指令来解析,结果就会出错。这就像是在书里故意插入一些乱码,让按顺序读的人看不懂。

(2)针对递归下降算法

花指令可以构造一些虚假的控制流。比如插入一些永远不会被执行的跳转指令,或者构造一些看起来像是条件分支但实际上没有意义的代码。递归下降算法会试图解析这些虚假的控制流,从而被误导,最终得到错误的反汇编结果。

关于一些简单的花指令的构造,我还没太搞清楚,下一篇博客再讲解吧

相关推荐
ZHANG8023ZHEN10 小时前
fMoE论文阅读笔记
论文阅读·笔记
Ro Jace11 小时前
文献阅读笔记:R&S电子战测试与测量技术文档
笔记
兔子不吃草~12 小时前
Transformer学习记录与CNN思考
学习·cnn·transformer
ZZHow102412 小时前
Maven入门_简介、安装与配置
java·笔记·maven
与己斗其乐无穷13 小时前
C++学习记录(8)list
学习
有谁看见我的剑了?13 小时前
k8s-容器探针和生命周期回调学习
学习·容器·kubernetes
芜狄15 小时前
UCOSIII移植——学习笔记1
笔记·嵌入式硬件·学习·stm32f103rct6·ucosiii实时操作系统
所愿ღ15 小时前
JavaWeb-Servlet总结及JSP
java·笔记·servlet
Cellular_Modem笔记16 小时前
5G NR-NTN协议学习系列:NR-NTN介绍(2)
学习·5g·ntn
笨鸟笃行16 小时前
人工智能训练师三级备考笔记
笔记