ARM简介

ARM vs Intel

Intel和ARM之间主要区别在于指令集。Intel是一种CISC(复杂指令集计算)处理器,具有更大、功能更丰富的指令集,并允许多种复杂指令访问内存。因此与ARM相比,它具有更多的操作、寻址模式,但寄存器更少。CISC 处理器主要用于普通 PC、工作站和服务器。

ARM 是RISC(精简指令集计算)处理器,具有更简化的指令集和更通用的寄存器。ARM是一种加载/存储架构 ,这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中,修改,然后存储到内存中。

精简指令集有其优点和缺点。优点之一是指令可以更快地执行,从而可能实现更高的速度。缺点是,更少的指令意味着更加强调使用有限的可用指令来高效编写软件。

另一些区别:

  • 在 ARM 中,大多数指令都可用于条件执行。
  • Intel x86 和 x86-64 系列处理器使用 little-endian 格式
  • ARMv3之前,使用little-endian,之后,全部使用big-endian,并允许切换字节序。

不仅ARM和Intel之间存在差异,而且不同的ARM版本也存在差异。不同版本的命名规则也很乱,可以参考https://en.wikichip.org/wiki/arm/versions

汇编语言

如果希望构建自己的 ARM shellcode、制作 ARM ROP 链和调试 ARM 应用程序,则需要理解ARM汇编中的一些关键点。

汇编语言是一种比机器代码更易于人类阅读和编写的编程语言。它提供了一种方式,让我们可以用更接近人类语言的符号来编写程序,而不是直接使用计算机理解的二进制形式的机器代码。尽管汇编语言比机器代码更易读,但计算机本身不能直接执行汇编代码,需要将其转换为机器代码。这个转换过程通常由汇编器完成,如GNU Binutils项目中的GNU汇编器,它能够处理以".s"为扩展名的源文件,将汇编代码转换成计算机可以执行的机器代码。

而高级语言又在汇编语言的基础上,进一步抽象化编程过程,使得开发者能够快速构建复杂的应用程序,同时保持代码的可读性和可维护性。一个高级语言编写的程序转换为机器指令的过程如下图:

汇编之下

计算机的基础是电路,而电路的核心是电信号,信号通过电压的变化来传递,可以将电压设置为两个状态:0伏(表示“关闭”)或5伏(表示“开启”)。为了直观地表示这些电压变化,使用0和1这两个数字来代表电压的高低状态。这是一种非常基础的数学系统,叫做二进制系统,它只使用两个数字:0和1。

将这些0和1的序列进行分组,从而形成一个机器指令,机器指令时计算机CPU的最小工作单元,一个机器指令示例如下:

1110 0001 1010 0000 0010 0000 0000 0001

仅记忆0和1的序列,很难记得每个机器指令的意思,此时汇编语言产出,使用助记符来代码这些01序列,即机器指令,其中每个机器指令都有一个名称,通常由三个字母组成,接下来就可以使用这些助记符作为指令编写程序,写出来的程序称之为汇编程序。用于表示机器指令的助记符的集合称之为汇编语言。因此,汇编语言是人类在计算机进行编程的最底层。一个用助记符写的汇编代码如下:

	pushq	%rbp
	movq	%rsp, %rbp
	leaq	.LC0(%rip), %rax
	movq	%rax, %rdi
	call	puts@PLT
	movl	$0, %eax
	popq	%rbp

Reference

ARM assembler in Raspberry Pi.

Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation by Bruce Dang, Alexandre Gazet, Elias Bachaalany and Sebastien Josse.

ARM Assembler User Guide