X64汇编语言教程(白帽黑客系列课程)(一)

为什么要写这篇教程呢?

本文章仅提供学习,切勿将其用于不法手段!

因为想要成为一名白帽黑客,汇编语言是必须要掌握的!

无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !

你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !

为什么要学会代码审计呢?

你可能需要阅读 IDA 翻译而成的 C语言 源码!

你需要看下当前这个二进制文件中,是否使用了敏感函数,以及是否发生了数组越界,或者堆地址的异常申请与释放 ! 你需要了解,格式化字符串漏洞 中最为著名的 %n 利用方法!

格式化字符 %n 为何如此的引入注目 ?格式化字符 %n 为何如此的特殊 !

我们要了解 %n 的用途,它和其它的格式化字符不同,注意,它是用于写入数据的!并且,它的用途 是向指定的内存地址中 写入数据 !这才是它的价值,以及它被黑客们关注的原因!

通过巧妙地使用 %n 格式化字符,黑客们可以很容易进入到 程序的执行过程中 ,也就是劫持到 当前 被执行程序的 控制权!

话题有点扯远了!我们重新回到汇编语言,汇编语言是二进制漏洞挖掘的基础,所以,作为一名白帽黑客,汇编语言,是必须要学会的!

正文开始..................................................

我们主要讲述下,X64环境下的汇编语言!

X86环境下的汇编语言,目前已经很少被用到了,毕竟,我们的操作系统大环境,目前基于都是 WINDOWS 11 或者 DEBIAN 、CENTOS 等这些了!

我们主要讲述,在X64环境下,如何进行汇编语言编程!

X64环境下,有若干个寄存器,它们基本都是64位的!

这些寄存器,大家要记住!

上面的图中的红线范围部分中的寄存器,都是64位寄存器!

不知道什么是“寄存器”的,请问度娘,这里就不科普了。

64位寄存器,有个通用性特点,就是以字母 “r” 开头!

32位寄存器,通常是以字母 “e” 开头的,这是一个非常明显的区分!

注意,64位寄存器 ,包含了 32位寄存器 !64位寄存器的 右32位部分,就是 32位寄存器!

32位寄存器的 右16位部分,又是 16位寄存器 !

16位寄存器的 右 8 位部分,又是  8 位寄存器 !

在64位环境下,有时,也是会使用到 32位、16位、8位寄存器的!

64位寄存器,分别为 负责存储函数过程返回结果的 RAX 寄存器 ,存储栈基址指针的 RBP寄存器,存储栈偏移指针的RSP寄存器,GCC环境下存储当前函数第一个参数内容的RDI寄存器,GCC环境下存储当前函数第二个参数内容的RSI寄存器,GCC环境下存储当前函数第三个参数内容的RDX寄存器,GCC环境下存储当前函数第四个参数内容的RCX寄存器,GCC环境下存储当前函数第五个参数内容的R8寄存器,GCC环境下存储当前函数第六个参数内容的R9寄存器,用于存储下一条指令执行偏移的RIP寄存器(当前指令地址+当前指令长度+RIP寄存器内容,指向下一个代码指令的内存地址),还有其它的通用寄存器,例如 RBX寄存器,以及 R10~R15寄存器 等。

注意,在MSVC环境下,RDX寄存器用于存储当前函数的第一个参数内容,RCX寄存器用于存储当前函数的第二个参数内容,R8寄存器用于存储当前函数的第三个参数内容,R9寄存器用于存储当前函数的第四个参数内容。

64位的RFLAGS寄存器,是非常特殊的标志寄存器!用于存储各种标志状态,RFLAGS 寄存器的作用和读写操作访问方法,将在后面的课程中进行介绍。

64位的RFLAGS寄存器的左32位全部是保留位,右32位部分,又是 EFLAGS 寄存器(迄今为止,真正存储各种标志状态内容的地方)!

128位寄存器,分别为 负责存储当前函数第N个浮点型参数的 XMM0~XMM7寄存器 等。

以“XMM”开头的寄存器,被用于浮点类型数据的相关运算,以及浮点类型函数参数的内容传递!

RBP寄存器,用于保存当前栈帧的基址,也就是当前函数使用到的栈空间在内存中的起始位置(注意,入栈操作,是在当前函数使用到的栈空间在内存中的起始位置基础上向下偏移的,出栈操作,是在当前函数使用到的栈空间在内存中的起始位置基础上向上偏移的,入栈行为,RSP寄存器的内容自减8,出栈行为,RSP寄存器的内容自增8)。

不知道 自减、自增 是什么的,请自行百度 !

除了 上面这些寄存器之外,还有目前具有其它用途的 CS 、SS、DS、ES、GS、FS 等16位寄存器,在特权模式0环境下和特权模式3环境下,这些寄存器的内容设置稍有不同,以后会讲解这些不同之处! CS 、SS、DS、ES、GS、FS 这些16位寄存器,在实模式下,被用作段基址寄存器用途,但是在保护模式下,这些寄存器通常被用来存储“段选择子” !说到段选择子,就要提到 段描述符、段描述符表 、全局段描述符表GDT、局部段描述符表LDT、段模式、段页模式 、内存管理 等更加底层的相关知识内容。这里不再更深的去讲这些东西,我以前写的文章中,比较详细的介绍了一下相关的东西,有兴趣的童鞋儿们,可以去看看我发布的其它文章。

为了降低学习成本,目前大家基本用不到的,更深层次的知识内容,我会放到以后去讲,讲的太深,会吓退很多想要学习汇编语言的童鞋儿 ^_^

(未完待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值