从零开始学逆向之x86篇(二)

2021-01-13 4,210

在本系列文章中,我们将为读者从头开始介绍x86架构下的逆向工程技术。

上一篇

4课: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位架构。

 

在我们的下一节课中,我们将讨论二进制。您不妨先冲上一杯咖啡,我想您会需要它的!

 

5课:二进制

 

如果需要所有课程的完整目录,请点击下面连接,因为它不仅提供了每节课程的简介,同时提供了每节课所涵盖的主题: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。下面,我们举例进行说明:

 

01.jpg


二进制数之所以重要,是因为用它来代替十进制后,能够极大简化计算机和相关技术的设计。二进制数系统最简单的定义是,如上所述,只使用两个数字来表示计算机体系结构所需的数字,而不是使用数字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种不同的符号。

 

让我们看一个简单的表格,来看一下十六进制和十进制的对应关系。

 

    01.jpg 

 

好的,我看到烟从你耳朵里冒出来了,不过没关系!在十进制中,所有的东西都是以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 十六进制

 

让我们来看看二进制到十六进制的转换表:

 

 01.jpg 

 

重要的是要明白:每一个十六进制的数字都占用4个二进制位,或者叫做半字节。当我们将C代码转换为汇编代码时,这一点将变得至关重要。

 

让我们换一种方式来看待这个问题。为此,让我们再处理一些十六进制数,并将它们转换为十进制数:

 

01.jpg


再次强调,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”:

 

 01.jpg

 

另一个例子是:

 

 01.jpg

 

最后一个加法示例如下:

 

01.jpg


现在,我们开始重点讲解减法:

 

01.jpg


你可能会问自己,为什么这家伙要花这么多时间去鼓捣这么多表示方法!答案是我们每个人都能从下一个表示方法中学到不同的东西。与十进制和二进制相比,我想展示十六进制的多种表示形式,以帮助大家理解它们的关系。

 

再继续学习下面的课程之前,您必须先弄清楚这里讲的东西。如果您有任何疑问,请在下面评论,我将非常乐意帮助您!

 

下一课我们将讨论开关、晶体管和存储器。

 

小结

 

在本系列文章中,我们将为读者从头开始介绍x86架构下的逆向工程技术。更多内容,敬请期待!

(未完待续)

https://0xinfection.github.io/reversing/pages/part-6-hexadecimal-number-system.html


本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/151406.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:42 积分: 577

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号