针对Android上的ROP攻击剖析

引言 ROP(Return-oriented programming),即“返回导向编程技术”。其核心思想是在整个进程空间内现存的函数中寻找适合指令片断(gadget),并通过精心设计返回堆栈把各个gadget拼接起来,从而达到恶意攻击的目的。构造ROP攻击的难点在于,我们需要在整个进程空间中搜索我们需要的gadgets,这需要花费相当长的时间。但一旦完成了“搜索”和“拼接”,这样的攻击是无法抵挡的,因为它用到的都是内存中合法的的代码,普通的杀毒引擎对ROP攻击是无计可施的。栈溢出漏洞及栈溢出攻击 在介绍ROP技术原理前,需要先介绍一下栈溢出漏洞。 栈溢出(stack-based buffer overflows)算是安全界常见的漏洞。一方面因为程序员的疏忽,使用了 strcpy、sprintf 等不安全的函数,增加了栈溢出漏洞的可能。另一方面,因为栈上保存了函数的返回地址等信息,因此如果攻击者能任意覆盖栈上的数据,通常情况下就意味着他能修改程序的执行流程,从而造成更大的破坏。这种攻击方法就是栈溢出攻击(stack smashing attacks)。 栈溢出攻击的原因是由于程序中缺少错误检测,另外对缓冲区的潜在操作(比如字符串的复制)都是从内存低址到高址,而函数调用的返回地址往往就在缓冲区的上方(当前栈底),这为我们覆盖返回地址提供了条件。下面是stack smashing attacks示意图

下面是一个存在栈溢出的DEMO:

#include <stdio.h> #include <string.h>

int bof(FILE *badfile){ char buffer[20]; fread(buffer, sizeof(char), 100, badfile); return 1; }

int main(){ FILE *badfile; badfile = fopen("badfile", "r"); bof(badfile);

printf("Returned Properly\n"); fclose(badfile); return 0; } DEMO的逻辑很简单,就是从badfile文件中读取最长100字节的数据,然而buffer的长度只有20字节,所以这里是有可能发现栈溢出的。

下面是在cygwin的环境下编译出来的汇编代码(我已经把一些对逻辑理解无关的细节去掉):

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $LC0, 4(%esp)movl $LC1, (%esp)call _fopenmovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, (%esp)call _bofmovl $LC2, (%esp)call _putsmovl 28(%esp), %eaxmovl %eax, (%esp)call _fclosemovl $0, %eaxleaveret

_bof:pushl %ebpmovl %esp, %ebpsubl $56, %espmovl 8(%ebp), %eaxmovl %eax, 12(%esp)movl $100, 8(%esp)movl $1, 4(%esp)leal -28(%ebp), %eaxmovl %eax, (%esp)call _freadmovl $1, %eaxleaveret

我们只关注从main进入bof以及bof执行完毕后返回main这个过程。 整个堆栈的内存布局如下所示:

从分布图可以看到,系统实际分配给buffer的长度是28字节,接下来就是旧的栈底地址,bof返回地址和badfile地址。因此当badfile的内容长度是低于28字节的情况下,程序依然可以正常运行。但当badfile的内容长度超出28字节,就会直接把old EBP和ret address覆盖掉,这就达到了修改返回地址的目的了。ROP的前世今生 前面大家对stack smashing attacks有了一个感性的认知之后,接下来我们再来了解一下ROP技术的发展过程。 stack smashing attacks 这种攻击手段,是最早栈溢出攻击的方式,前面已经做了详细的分析了。ASLR(Address Space Layout Radomization),通过这两种技术的保护下Stack smashing attacks一定程度上揭制。 Return-to-library technique 简称“Ret2Lib”,这种技术可以绕过DEP的保护,其核心思想是把返回地址直接指向系统某个已存在的函数(一般是system,因为其使用简单,参数只有一个),这样同样可以达到攻击的目的。再来看刚才的例子,如果在badfile构造一些数据,使其被bof函数读取后,达到如下堆栈分布:从一开始就提醒自己,世上没有后悔药吃。

针对Android上的ROP攻击剖析

相关文章:

你感兴趣的文章:

标签云: