【愚公系列】2022年06月 ARM汇编 指令集

举报
愚公搬代码 发表于 2022/06/30 20:47:47 2022/06/30
【摘要】 学习ARM的指令集ARM处理器有两种工作状态ARM和Thumb。这两种工作状态和运行模式没有任何关系。比如不论是ARM还是Thumb状态的代码都可以运行在用户模式下。这两种工作状态之间最大的差异是指令集,ARM状态的指令长度是32位的,Thumb状态的指令长度是16位的(也可能为32位)。了解如何使用Thumb工作状态对于编写ARM平台的漏洞利用是至关重要的。当我们编写ARM shellc...

学习ARM的指令集

ARM处理器有两种工作状态ARM和Thumb。这两种工作状态和运行模式没有任何关系。比如不论是ARM还是Thumb状态的代码都可以运行在用户模式下。这两种工作状态之间最大的差异是指令集,ARM状态的指令长度是32位的,Thumb状态的指令长度是16位的(也可能为32位)。了解如何使用Thumb工作状态对于编写ARM平台的漏洞利用是至关重要的。当我们编写ARM shellcode时,需要使用16 bit的Thumb指令代替32 bit的ARM指令,从而避免在指令中出现’\0’截断。

Thumb有不同的版本,下面我们对不同的版本做一下简单的介绍,注意不同的命名只是为了区分不同的版本(换句话说,处理器只知道它运行在Thumb状态,其它一概不知)。

· Thumb-1(16位指令):用于ARMv6和更早的版本。
· Thumb-2(16位和32位指令):对Thumb-1的扩展,添加了更多指令并允许它们为16位或32位宽(ARMv6T2,ARMv7)。
· ThumbEE:在Thumb-2基础上包含了针对动态代码生成(代码在执行前或执行期间编译代码)的一些变更和补充。

  1. 简单介绍ARM的指令集和它的基本用法

1)ARM指令通常跟一到两个操作数,我们使用如下模板描述:

MNEMONIC{S}{condition} {Rd}, Operand1, Operand2

其中各个字段的作用如下:

MNEMONIC - 指令的助记符如ADD

{S} - 可选的扩展位,如果指令后加了S,将依据计算结果更新CPSR寄存器中相应的FLAG

{condition} - 执行条件,如果没有指定,默认为AL(无条件执行)

{Rd} - 目的寄存器,存储指令计算结果

Operand1 - 第一个操作数,可以是一个寄存器或一个立即数

Operand2 - 第二个(可变)操作数,可以是一个立即数或寄存器甚至带移位操作的寄存器

助记符、S扩展位、目的寄存器和第一个操作数的作用很好理解,不多做解释,这里补充解释一下执行条件和第二个操作数。设置了执行条件的指令在执行指令前先校验CPSR寄存器中的标志位,只有标志位的组合匹配所设置的执行条件指令才会被执行。第二个操作数被称为可变操作数,因为它可以被设置为多种形式,包括立即数、寄存器、带移位操作的寄存器,如下所示:

#123 - 立即数

Rx - 寄存器比如R1

Rx, ASR n - 对寄存器中的值进行算术右移n位后的值

Rx, LSL n - 对寄存器中的值进行逻辑左移n位后的值

Rx, LSR n - 对寄存器中的值进行逻辑右移n位后的值

Rx, ROR n - 对寄存器中的值进行循环右移n位后的值

Rx, RRX - 对寄存器中的值进行带扩展的循环右移1位后的值

2)常见的指令包括:
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。