《Linux x86 汇编语言视角下的shellcode》
计算机是由软件与硬件两部分组成,通过软件对硬件进行管理,指定硬件做相关操作来实现具体功能。软件本质上是计算机能够识别的指令,它是由编程语言开发并经过编译和链接等步骤生成的。随着计算机科学的进步,各种编程语言不断涌现并演变,但是汇编语言是除机器指令外,最接近计算机底层的编程语言,因此掌握汇编语言将会帮助读者深入地理解计算机程序在执行过程中的核心原理,能够更好地调试和修补程序中可能存储的Bug问题。在本章中将介绍关于虚拟机软件的安装步骤与使用方法、下载并导入Kali Linux虚拟机文件的方式、安装汇编语言的编译与链接程序,以及编写并执行第1个汇编程序。
1.1 创建虚拟机实验环境
操作系统是计算机的核心,用户通过操作系统来实现对计算机的管理,从而完成任务。常见的计算机操作系统有Windows、Linux、Unix、macOS等,其中,Windows操作系统通过直观的图形用户界面提供了易于理解和操作的用户体验,使用户可以通过单击和拖放来完成任务,而不需要深入的技术知识。这一特性也使Windows成为全球范围内广泛使用的操作系统之一。对于大多数读者来讲,Windows操作系统也是个人计算机中默认安装的操作系统,因此为了能够在Windows操作系统中同时运行Linux操作系统,虚拟机实验环境将会是一个不错的选择。
1.1.1 简明介绍虚拟机软件
计算机中的虚拟机是一种虚拟化技术,它通过软件模拟计算机硬件环境,实现了在同一物理计算机上运行多个虚拟机,每个虚拟机可以运行不同的操作系统和应用程序,充分利用硬件资源,从而减低硬件需求和能耗。由此可知,虚拟机实验环境是由虚拟机软件和虚拟机文件组成。虚拟机软件能够识别并加载虚拟机文件,在文件中保存着可以被启动的操作系统。如果虚拟机软件成功加载并执行该文件,则会默认启动该文件对应的操作系统,如图1-1所示。
图1-1 虚拟机环境的组成与运行原理
当虚拟机软件完成启动虚拟机文件对应的操作系统后,用户就可以在虚拟机软件中使用并管理该操作系统。虽然市面上具有许多不同种类的虚拟机软件,但是它们的使用方法大同小异,因此本书将以Vmware workstation虚拟机软件为例阐述关于搭建虚拟机环境的相关步骤。当然,感兴趣的读者也可以尝试使用其他类型的虚拟机软件来完成搭建任务。
1.1.2 轻松安装虚拟机软件
VMware workstation是VMware公司开发的一款强大的虚拟机软件,主要用于个人计算机上的虚拟化环境创建和管理。VMware workstation软件不仅提供了硬件虚拟化和对多种操作系统的支持,也具有直观的操作界面使用户可以轻松地创建、配置和管理虚拟机,使它成为个人计算机上广受欢迎的虚拟化软件之一,适用于开发、测试、培训和实验等各种场景。
通过Vmware公司官网提供的下载链接能够获取Vmware workstation的安装程序。在完成下载后,双击该程序即可启动安装。如果成功安装Vmware workstation软件后,则可以打开该软件的起始窗口,如图1-2所示。
图1-2 Vmware workstation软件的起始界面
虽然成功安装了Vmware workstation虚拟机软件,但是该软件中并没有加载虚拟机文件,因此也不存在运行的虚拟机环境。接下来,本书将介绍在Vmware workstaiton软件中加载并启动虚拟机文件,从而实现运行Linux虚拟机环境的功能。
1.1.3 Linux系统的基本概念
Linux是一种开源的类似于Unix的操作系统内核,具有高度的稳定性、安全性和灵活性,被广泛地应用于各种计算设备和环境。在日常工作中涉及的Linux是在Linux内核基础上添加了各种应用软件,因此Linux可以被划分为内核版本和发行版本。
Linux内核是操作系统的核心部分,负责管理系统的基本功能和资源。它由Linux创始人Linus Torvalds及全球的开发者社区维护和更新。Linux内核的版本号是由主版本号、次版本号和修订号组成,例如,内核版本号5.10.0是由主版本号5、次版本号10,以及修订号0组成。
Linux发行版是在内核基础上,结合了不同的用户界面、应用程序、包管理工具和系统配置的完整操作系统。常见的Linux发行版包括Ubuntu、Debian、Red Hat、Fedora、CentOS等。每个发行版通常会基于特定的Linux内核版本,并提供特定的软件包和支持策略。虽然Linux具有许多不同的发行版本,但是它们之间的使用方式几乎一致,因此掌握其中任意一种Linux操作系统的使用方法,就能够快速地掌握其他发行版本的Linux的使用方法。
在实际应用中,用户选择Linux发行版时会考虑到其内核版本的稳定性、支持周期、社区支持和功能需求等因素,以满足其特定的使用场景和需求。在众多Linux发行版本中,Kali Linux是一个专为网络安全测试和渗透测试而设计的Linux发行版,它集成了大量的安全工具和软件包,方便安全人员进行各种安全评估和测试,因此它也成为在网络安全领域中被广泛使用的Linux操作系统。
由于本书将阐述关于网络安全领域中shellcode的相关内容,因此采用Kali Linux发行版本作为虚拟机的操作系统。
1.1.4 导入Kali的虚拟机文件
Kali Linux是基于Debian Linux内核的开源 Linux 发行版,主要用于完成各种信息安全任务,如渗透测试、安全研究、计算机取证和逆向工程。在搭建Kali Linux实验环境方面,用户既可以在真实的物理机中安装Kali,也能够使用虚拟机软件来搭建Kali的虚拟机实验环境。
当然,Kali官方为了便于用户的使用,它提供了已经安装好的Kali 虚拟机文件。如果用户可以成功下载该文件,则能够使用虚拟机软件导入该文件,即可正常启动并运行Kali Linux的虚拟机实验环境。
Kali官方同时提供了64位和32位的虚拟机文件的下载链接。虽然本书仅涉及32位的汇编语言,但是64位的操作系统将会逐步替代32位操作系统并且64位操作系统也可以兼容运行32位汇编语言编写的应用程序,因此本书将以64位Kali Linux为虚拟机实验环境的操作系统来阐述关于32位汇编语言的相关内容。
在Kali官网中下载VMware虚拟机文件的压缩文件并使用解压缩软件进行解压。在完成解压后会自动生成用于保存Kali虚拟机文件的目录。接下来,用户可以通过双击解压目录中以.vmx为后缀名的虚拟机配置文件来使用Vmware workstation软件对虚拟机进行加载,如图1-3所示。
图1-3 使用VMware workstation软件加载Kali虚拟机
在Vmware workstaiton窗口中,通过单击“开启此虚拟机”按钮即可启动Kali虚拟机,但是,Kali Linux需要验证用户提供的用户名和密码是否正确。如果用户输入正确的用户名和密码,则会成功登录到Kali Linux系统中并能够正常的使用它,否则Kali Linux会输出错误提示信息。
由Kali官方提供的虚拟机会同时使用kali作为用户名和密码。当用户成功验证并登录Kali Linux系统后,则会自动跳转到Kali Linux的桌面窗口中,如图1-4所示。
图1-4 Kali Linux的桌面窗口
在完成安装Kali Linux之后,进行系统更新是至关重要的,它不仅能确保系统的安全性和稳定性,还能保证获取最新版本的软件并成功安装相关软件。
高级软件包工具(Advanced Package Tool,APT)是一个在Debian和基于Debian的 Linux发行版中广泛使用的包管理系统。APT提供了一套工具,用于简化软件包的安装、更新和删除,并自动处理软件包的依赖关系。接下来,本书仅说明APT中安装软件包的相关命令。感兴趣的读者可以自行学习并掌握APT的其他命令。
APT是通过从配置仓库中下载最新的软件包列表,并将这些信息存储在本地,以便系统知道有哪些软件包可用及其版本信息,其中,apt update命令能够用于实现更新本地软件包列表信息的功能,但是,必须使用Linux系统中的最高权限来执行APT相关命令,否则会在终端窗口中输出相关的错误提示信息,表明不具有执行该操作的权限,如图1-5所示。
图1-5 未使用最高权限执行APT命令后的错误信息
因此,用户需要通过Linux系统命令sudo来提升到最高权限,从而能够正确执行APT相关命令。如果在终端窗口中成功执行sudo apt update命令,则会提示输入kali用户的密码。在完成输入kali密码后,APT工具会启动更新软件包列表的进程,如图1-6所示。
图1-6 使用APT命令更新软件包列表
在成功运行该命令后,系统会连接到在配置文件中指定的软件仓库,下载最新的软件包列表,并更新本地缓存。当然,在这个过程中并没有升级相关软件,因此用户需要继续执行sudo apt upgrade命令根据已更新的软件包列表来升级所有已安装的软件包到它们最新版本。在终端窗口中执行更新命令时会输出将要更新的软件包列表信息,如图1-7所示。
图1-7 软件包更新列表信息
此时,用户需要根据提示信息输入Y来确认是否执行更新操作,如图1-8所示。
图1-8 输入Y执行更新操作
当用户输入Y并按Enter键,即可启动升级已安装软件包的进程。虽然该命令用于下载并安装最新版本的软件包,但它并不会安装Kali中未安装过的软件包或删除已安装的软件包。如果升级某个软件包需要新的依赖包或删除已安装的软件包,则该升级会被跳过,从而导致更新软件失败。
因此,用户必须使用sudo apt dist-upgrade命令来处理软件包之间复杂的依赖关系和版本冲突问题。这条命令不仅可以升级已安装的软件包,还会根据需要来安装新的依赖包或删除旧的依赖包,以确保所有软件都能成功升级。当成功执行该命令后,则会输出系统中不再需要的软件包信息,如图1-9所示。
图1-9 列举不再需要的软件包信息
最后,用户可以通过执行sudo apt autoremove命令来删除不再需要的软件包。值得注意的是,需要输入Y启动删除进程,如图1-10所示。
图1-10 删除不再需要的软件包
当然,读者既可以逐条执行APT中用于更新软件包的命令,也能够使用Linux操作系统提供的命令连接符&&将多条命令连接为一条命令来执行。使用连接符组成的命令如下:
sudo apt update && sudo apt upgrade && sudo apt dist-upgrade && sudo apt autoremove
如果在终端窗口中成功执行该命令,则会分别输出对应的提示信息,如图1-11所示。
图1-11 执行使用连接符组成的命令
由于已完成对软件包的更新操作,所以终端窗口中并不会输出更新软件的相关信息。当然,Linux操作系统提供了多种用于不同场景的命令连接符,例如,&&、||、;等。感兴趣的读者也可以尝试使用其他命令连接符来完成软件包的更新。
1.2 构建汇编开发工具包
笔者认为编程的本质是使用编程语言在文本文件中编辑代码后,使用编译和链接程序将其转换为可执行程序的过程。接下来,本书将以编写在终端窗口中输出Hello Hacker字符串的程序为例来阐述相关概念。
1.2.1 编写第1个汇编程序
在Kali Linux操作系统中,默认集成了VIM文本编辑器,用户能够使用它实现在终端窗口中编辑文本文件的功能。当然,VIM提供各种强大的功能,但本章节仅涉及VIM的基本操作方法,更多关于VIM工具的使用方法读者可参考后续章节。
首先,在终端窗口中使用sudo vim hello.asm命令创建并打开hello.asm文件,如图1-12所示。
图1-12 使用VIM创建并打开hello.asm文本文件
接下来,在VIM工具窗口中输入i命令,开启文本编辑模式并使用汇编语言编写代码。使用编程语言时都具有约定俗成的模板格式,汇编语言也不例外。

浙公网安备 33010602011771号