在本系列文章中,我们将为读者从头开始介绍x86架构下的逆向工程技术。
如果需要查看所有课程的完整目录,请点击下面连接,因为它不仅提供了每节课程的简介,同时提供了每节课所涵盖的主题:https://github.com/mytechnotalent/reverse-engineering-tutorial。
女士们,先生们,男孩、女孩们,各个年龄段的**们! 我们即将踏上一段将永远改变你生活的旅程!
要想很好地理解汇编语言,需要学习大量的资料。
我们必须回答的第一个问题是:什么是x86汇编语言?答案是一个向后兼容的汇编语言系列,它提供了对Intel 8000系列微处理器的兼容性。它使用助记符表示CPU可以执行的指令。
x86微处理器的汇编语言可以与各种操作系统配合使用。除了学习如何用C编程之外,我们还将重点介绍利用Intel语法的Linux汇编语言;我们会将C代码编译为汇编代码,并进行相应的分析。
实际上,x86汇编语言支持两种语法。其中,AT&T语法在Unix世界中占据主导地位,因为这些操作系统是在AT&T贝尔实验室开发的。相反,Intel语法最初用于x86平台,因此,它在MS-DOS和Windows环境中占主导地位。
就我们的目的而言,当我们最终反汇编或调试软件时,无论是在Linux还是Windows环境中,我们大多时候看到的都是Intel语法。无论我们检查的是PE格式的Windows二进制文件还是ELF格式的Linux二进制文件,这都是至关重要的。本教程后面将对此进行更多介绍。
两者之间的主要区别是在AT&T语法中,源操作数在目的操作数之前,而在Intel语法中,目的操作数在源操作数之前。我们将在本教程后面更详细地讨论这一点。
在您迈出大门并后悔踏上这段旅程之前,记住,一些基本的背景知识有助于我们在整个探索过程中不断前进。就目前来说,许多主题可能会令人困惑,这是完全正常的,因为我们才踏上征程。
我们将关注Linux汇编,因为Linux可以运行在多种硬件上,如手机、个人计算机或商业服务器等。
此外,Linux也是开源的,具有丰富的版本。在本系列课程中,我们主要使用Ubuntu,它也是可以免费获得的。相比之下,Windows操作系统是由微软公司拥有和控制的,所有的更新、安全补丁和服务补丁都直接来自微软;Linux则拥有数百万的专业人士,他们可以免费提供相同的服务!
同时,我们还将关注32位体系结构,因为最终大多数恶意软件都是为32位体系结构编写的,以便感染尽可能多的系统。同时,32位应用程序/恶意软件也可以在64位系统上运行,因此,我们将介绍32位架构。
在我们的下一节课中,我们将讨论二进制。您不妨先冲上一杯咖啡,我想您会需要它的!
如果需要所有课程的完整目录,请点击下面连接,因为它不仅提供了每节课程的简介,同时提供了每节课所涵盖的主题:https://github.com/mytechnotalent/reverse-engineering-tutorial。
二进制是计算机技术的基石。计算机中的二进制位,要么处于打开状态,要么处于关闭状态。或者说,一个二进制位要么通电,要么没有通电。我们将在以后的教程中深入探讨这一点。
困惑,迷茫,我们将走向何方?
不要害怕!二进制计数制来了!重要的是要了解,在二进制中,每一列的值是其右边列的两倍,并且其基数为2,每个数位上只能取两个数字之一,即使0和1。
在十进制中,以10为基数,假设我们有一个数字15,这意味着(1 x 10)+(5 x 1)=15,因此,在这里,5表示1的倍数,1表示10的倍数。
二进制以类似的方式工作,但是我们现在的基数为2。上面的十进制数15,对应的二进制数为1111。下面,我们举例进行说明:
二进制数之所以重要,是因为用它来代替十进制后,能够极大简化计算机和相关技术的设计。二进制数系统最简单的定义是,如上所述,只使用两个数字来表示计算机体系结构所需的数字,而不是使用数字1到9加0来表示这些数字。
在我们的下一课中,我们将讨论十六进制计数制。实际上,从这里开始,事情会变得更令人兴奋!
如果需要查看所有课程的完整目录,请点击下面连接,因为它不仅提供了每节课程的简介,同时提供了每节课所涵盖的主题:https://github.com/mytechnotalent/reverse-engineering-tutorial。
现在,我们已经是二进制大师了,是时候解决计数制中的计数制了!
我们在二进制中了解到,每个数字代表一个位。如果我们把8个比特组合起来,就会得到一个字节。一个字节可以进一步细分为它的最高4位和低4位。4位的组合就是一个“半字节”。由于4个二进制位可以表示的十进制数值范围为0到15,因此,这个基数为16的计数制会更易于使用。请记住,当我们说基数16时,我们从0开始,因此0-15是16个不同的数字。
这个令人兴奋的计数制被称为十六进制。我们使用这个记数制的原因是,在x86汇编中,用十六进制来表达二进制数字表示比其他任何记数制都要容易得多。
十六进制与其他记数制都很相似,只是在十六进制中,每一列的值是其右边一列值的16倍。十六进制的有趣之处在于,我们不仅有0、1、2、3、4、5、6、7、8、9,还有A、B、C、D、E和F,因此有16种不同的符号。
让我们看一个简单的表格,来看一下十六进制和十进制的对应关系。
好的,我看到烟从你耳朵里冒出来了,不过没关系!在十进制中,所有的东西都是以10的幂来处理的。下面,让我们拿数字42为例来研究一下它的十进制形式。
2 x 10 ^ 0 = 2
4 x 10 ^ 1 = 40
记住,10的0次方是1,10的1次方是10,所以,2+40=42。
端起你的咖啡,有趣的东西来了!
如果我们明白十进制就是一个以10为基数的计数制,我们就可以创建一个简单的公式,其中b代表基数。就这里来说,b=10。
(2 * b ^ 0) + (4 * b ^ 1)
(2 * 10 ^ 0) + (4 * 10 ^ 1) = 42
在二进制中,十进制值42等于二进制值0010 1010,其关系如下所示:
0 x 2 ^ 0 = 0
1 x 2 ^ 1 = 2
0 x 2 ^ 2 = 0
1 x 2 ^ 3 = 8
0 x 2 ^ 4 = 0
1 x 2 ^ 5 = 32
0 x 2 ^ 6 = 0
0 x 2 ^ 7 = 0
0 + 2 + 0 + 8 + 0 + 32 + 0 + 0 = 42 十进制
在十六进制中,所有的东西都以16的幂来处理的。因此,以十进制表示的值42就是以十六进制表示的值2A:
10 * 16 ^ 0 = 10
2 * 16 ^ 1 = 32
10 + 32 = 42 decimal => 2A 十六进制
这相当于:
10 * 1 = 10
2 * 16 = 32
10 + 32 = 42 十进制 => 2A 十六进制
请记住,十进制数10等于十六进制数A,十进制数2等于十六进制数2。在我们上面的公式中,当我们处理A、B、C、D、E或F时,我们需要将它们转换为对应的十进制值。
让我们再以十六进制数F5为例,介绍一下转换过程:
5 x 16 ^ 0 = 5
15 x 16 ^ 1 = 240
5 + 240 = 245 十进制 => F5 十六进制
让我们来看看二进制到十六进制的转换表:
重要的是要明白:每一个十六进制的数字都占用4个二进制位,或者叫做半字节。当我们将C代码转换为汇编代码时,这一点将变得至关重要。
让我们换一种方式来看待这个问题。为此,让我们再处理一些十六进制数,并将它们转换为十进制数:
再次强调,F1CD可以进行如下所示的简单转换:
D --- 13 x 1 = 13
C --- 12 x 16 = 192
1 --- 1 x 256 = 256
F --- 15 x 4096 = 61,440
13 + 192 + 256 + 61,440 = 61,901
十六进制加法的工作方式如下所示。从现在开始,所有十六进制数字的旁边都将加上一个字母“h”:
另一个例子是:
最后一个加法示例如下:
现在,我们开始重点讲解减法:
你可能会问自己,为什么这家伙要花这么多时间去鼓捣这么多表示方法!答案是我们每个人都能从下一个表示方法中学到不同的东西。与十进制和二进制相比,我想展示十六进制的多种表示形式,以帮助大家理解它们的关系。
再继续学习下面的课程之前,您必须先弄清楚这里讲的东西。如果您有任何疑问,请在下面评论,我将非常乐意帮助您!
下一课我们将讨论开关、晶体管和存储器。
在本系列文章中,我们将为读者从头开始介绍x86架构下的逆向工程技术。更多内容,敬请期待!
(未完待续)
https://0xinfection.github.io/reversing/pages/part-6-hexadecimal-number-system.html
本文作者:mssp299
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/151406.html