reserve学习笔记(花指令)

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

定义

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

分类以及讲解

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

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

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

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

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

原理

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

(1)线性扫描算法

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

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

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

(2)递归下降算法

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

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

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

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

(1)针对线性扫描算法

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

(2)针对递归下降算法

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

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

相关推荐
知识分享小能手1 小时前
统计学学习教程,从入门到精通,参数估计 — 知识点详解与公式推导(10)
学习·机器学习·概率论
有Li1 小时前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
殷忆枫2 小时前
AI笔记三十七:AI边缘端道桥安全监测系统:YOLOv8n推理与Web监控全解析
笔记·yolo
逸模3 小时前
轻加盟模式,稳住品牌统一调性的思路
笔记·建模·公装·翻模·交底
whyTeaFo3 小时前
GAMES101: Lecture 10: Geometry 1 (Introduction) ppt笔记
笔记
sulikey4 小时前
个人Linux操作系统学习笔记11 - 环境变量
linux·笔记·学习
治愈系贝壳5 小时前
ARM --- day 6 时钟
linux·arm开发·学习
依然范特东5 小时前
强化学习笔记2--bellman equation
人工智能·笔记
minglie15 小时前
zynq高频小数据量PS闭环的三个实验-第0课:目的和目标
学习
乐观勇敢坚强的老彭5 小时前
信奥C++一维数组笔记
开发语言·c++·笔记