ARMv8 gadget的构成及其优势

  • 格式:doc
  • 大小:22.04 MB
  • 文档页数:4

第3页 Return-Oriented Programming on ARMv8-A

摘要: ARM公司在设计ARMv8-A体系架构的同时,采用了一系列新的技术来增强其安全性。然而针对ARMv8-A处理器架构,攻击者是否有可能以及如何来实施攻击,这一切尚未见有公开文章报道。返向编程技术是目前针对ARM架构普遍使用的攻击技术,本文首先总结并提出了ARMv8-A处理器架构上实施ROP攻击的必要条件,接着论述分析发攻击者为达成ARMv8 ROP攻击各个必要条件的可能的做法,并针对ARMv8架构的特性,提出了一种混合使用以ret指令和br指令结尾的短指令序列构造攻击的攻击方法,最后给出了ARMv8 ROP

shellcode的具体实例。据我们所知,本文是第一个给出ARMv8 ROP shellcoe实施实例的文章,本文的研究将对ARMv8架构上的安全防御起到积极作用。

关键词:ARMv8;返回导向编程;指令序列;

二.概述

2.1 ARMv8架构下gadget的构成

ROP攻击是通过利用库文件和可执行文件中的指令片段(gadget)实施攻击的。每个gadget都以一个分支指令结尾,并且完成一个特定的功能,例如mov、add、and等等。本文中将混合使用以ret指令和br指令结尾的gadget。本文中混合使用以ret指令和br指令结尾的gadget将具有以下优势。

(1)本文中混合使用以ret指令和br指令结尾的gadget减少了ROP攻击的特性。虽然仅仅使用以ret指令结尾的gadget也可完成ARMv8架构下的ROP攻击,但是ret指令使用的频率成为其一个严重的特点,研究者只需要将x86架构下的针对ROP攻击的防御技术(ROPdefender或DeROP等)简单的移植到ARMv8架构下,就可以有效的防御ROP攻击。本文混合使用以ret指令和br指令结尾的gadget减少了ROP攻击的特性,使其具有更好的隐蔽性,给防御技术带来了巨大的挑战。

(2)本文中混合使用以ret指令和br指令结尾的gadget减小了ROP shellcode 的大小,在一定程度上提高了ROP攻击的效率。例如我们通过gadget链来完成一个连续求和运算,为了简便,本文仅作三个数的连续求和(1+2+3)。我们使用两种gadget链完成。一种是使用仅以ret指令结尾的gadget,如图1中的(a)所示;另一种是混合使用以ret指令和br指令结尾的gadget,如图1中的(b)所示。假设x3寄存器中已经实现存储了gadget(5)的开始地址,并且在这里不考虑NUILL字节的问题。在内存中,我们没有用到的闲置内存全部用字符A填充。 第13页

图1 ARMv8架构gadget对比图

图1中的gadget是在libc.so.6库文件中搜索到的,每个gadget的第一行都是该gadget的开始地址。gadget(2)和gadget(4)完成同样的功能,即将x1寄存器和x2寄存器中的内容相加,结果保存到x1寄存器中。gadget(3)和gadget(5)具有同样的功能,即从当前栈顶读取一个常数到x2寄存器。

对于图1中的(a),首先从当前栈顶读取连个常数(1和2)分别放到寄存器x1和x2,然后sp加上32,将当前栈顶的数据(gadget(2)的开始地址0x7c834)放到寄存器x30,之后sp加上16,程序跳转到gadget(2)执行。ret指令为ARMv8架构下的返回指令,其默认返回到x30寄存器中的地址执行。gadget(2)将两个数据相加结果保存到x1寄存器中,然后从当前栈顶把gadget(3)的地址0x8d598加载到寄存器x30.程序跳转到gadget(3)执行,gadget(3)将常数3保存到x2中,然后从栈顶把gadget(2)的地址加载到x30寄存器中,程序跳转到gadget(2)执行,最终完成“1+2+3”的求和操作。通过计算,(a)中的shellcode共有88个字节。

对于图1中的(b)gadget的执行顺序和功能和(a)相同,不同的是(b)中gadget(4)完成两个数的相加后没有使用ret指令实现跳转,而是使用br指令实现跳转,此时x30寄存器中存放的仍然是gadget(2)的开始地址。程序跳转到gadget3后,从当前栈顶将数据3读取到寄存器x2,然后直接使用ret指令实现跳转,即程序将会返回到x30寄存器中的地址(gadget(2)的开始地址0x7c834)执行,(b)同样完成了“1+2+3”求和的功能。(b)shellcode的大小是56个字节,相比于(a)shellcode节省了32个字节。如果计算从1加到100的和,将会节省更多的空间。

2.2 构造ARMv8 ROP攻击的可行性

本节我们研究普通的库和可执行代码中构造ARMv8架构下ROP攻击的可行 性。ARMv8架构下ret指令和br指令的编码格式如图2所示。

第3页

图2 ARMv8架构分支指令编码

其中op表示指令的操作码,其含义如表1所示。Rn为存放目的地址的寄存器。

表1 op编码表

架构 op编码 汇编指令

ARMv8 00 br reg

10 ret reg

本文在linaro ARMv8 linux(linux version 3.6.0-1-linaro-vexpress64)的/bin和/usr/bin目录下存在178个应用程序,其所依赖的库文件引用统计如表2所示。从表2中可以看出库文件libc.so.6和ld-linux-aarch64.so.1使用的频率非常高,几乎所有的应用程序都依赖这两个库文件。本文中将在这两个常用的库文件中进行分析,统计ret指令和br指令的个数,统计结果如表3所示。

表2 linaro ARMv8 linux基本命令的库文件引用统计

库文件 使用次数 百分比

linux-vdso.so.1 178 100%

libc.so.6 178 100%

ld-linux-aarch64.so.1 178 100%

libgcc_s.so.1 49 27.5%

libdl.so.2 30 16.9%

libz.so.1 21 11.8%

libpthread.so.0 12 6.7%

libcrypt.so.1 11 6.2%

librt.so.1 9 5.1%

libelf.so.1 8 4.5%

从表3中我们可以看出在大小为1245096字节的libc.so.6库和大小为116344字节的ld-linux-aarch64.so.1库中ret指令分别有6067个和729个,br指令分别有32056个和378个,其数目可以提供足够的ARMv8架构下ROP攻击中使用的gadget。

第13页 表3 库中转移指令数目统计

汇 编

指 令 libc.so.6 ld-linux-aarch64.so.1

指令

数目 百分比 库大小 指令

数目 百分比 库大小

ret 6067 0.48% 1245096 729 0.63% 116344 br 2056 1.6% 378 0.32%

三.ARMv8架构下ROP攻击的设计与实施

本文的第二章已经说明了AARMv8架构下的ROP攻击的可行性,本章将主要介绍ARMv8架构下ROP攻击的原理和流程。

3.1 挑战

ARMv8 linux上要构建ROP shellcode,会面临以下的挑战和问题。

(1)ARMv8上漏洞利用及控制流劫持方法