reserve学习笔记(花指令)

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

定义

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

分类以及讲解

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

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

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

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

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

原理

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

(1)线性扫描算法

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

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

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

(2)递归下降算法

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

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

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

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

(1)针对线性扫描算法

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

(2)针对递归下降算法

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

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

相关推荐
Bonnie_12159 分钟前
04-jenkins学习之旅-java后端项目部署实践
学习
每次的天空17 分钟前
Android计算机网络学习总结
学习·计算机网络
与己斗其乐无穷26 分钟前
数据结构(5)线性表-栈
数据结构·学习
丶Darling.26 分钟前
Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和
数据结构·c++·学习·算法·二叉树
阿图灵27 分钟前
文章记单词 | 第114篇(六级)
学习·学习方法
jerry6091 小时前
LLM笔记(十)vLLM(1)PagedAttention论文笔记
论文阅读·人工智能·笔记·深度学习·学习·transformer
LVerrrr1 小时前
Missashe线代题型总结
笔记·学习·线性代数·考研
崔高杰1 小时前
提升推理能力会丢失指令跟随的能力?——【论文阅读笔记】
论文阅读·笔记
吃着火锅x唱着歌1 小时前
PHP7内核剖析 学习笔记 第八章 命名空间
android·笔记·学习
xiaohanbao092 小时前
day34 python深度学习训练优化实践:CPU vs GPU
人工智能·python·深度学习·学习·机器学习