【51CTO专稿】本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉。

1、什么是ASLR?

ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化。通过添加攻击者预測目的地址的难度。防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。通常情况下。黑客会利用某个特定函数或库驻存在特定内存位置的这一事实。通过在操纵堆或其它内存错误时调用该函数来发动攻击。ASLR则可以避免这样的情况。由于它能确保系统和应用程序的代码每次被载入时不会出如今同一个存储位置。

苹果的iOS系统自iOS 4.3以后就支持ASLR技术;尽管Comex在7月份公布的“iPhone越狱”软件就已攻克这一防御措施。而Android已经在4.0中应用了ASLR技术。

据研究表明ASLR能够有效的减少缓冲区溢出攻击的成功率,现在Linux、FreeBSD、Windows等主流操作系统都已採用了该技术。

2、缓冲区溢出攻击原理

缓冲区溢出是一种很普遍、很危急的漏洞。在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,能够导致程序执行失败、系统宕机、又一次启动等后果。

更为严重的是。能够利用它执行非授权指令。甚至能够取得系统特权。进而进行各种非法操作。

缓冲区溢出(图1)是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不同意输入超过缓冲区长度的字符,可是绝大多数程序都会如果数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为"堆栈". 在各个操作进程之间,指令会被暂时储存在"堆栈"其中,"堆栈"也会出现缓冲区溢出。

在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,当中最著名的样例是1988年利用fingerd漏洞的蠕虫。

而缓冲区溢出中,最为危急的是堆栈溢出,由于入侵者能够利用堆栈溢出。在函数返回时改变返回程序的地址。让其跳转到随意地址,带来的危害一种是程序崩溃导致拒绝服务,第二种就是跳转而且运行一段恶意代码,比方得到shell,然后为所欲为。

历史上最著名的缓冲区溢出攻击可能要算是1988年11月2日的Morris Worm所携带的攻击代码了。

这个因特网蠕虫利用了fingerd程序的缓冲区溢出漏洞,给用户带来了非常大危害。此后,越来越多的缓冲区溢出漏洞被发现。从bind、wu-ftpd、telnetd、apache等经常使用服务程序,到Microsoft、Oracle等软件厂商提供的应用程序,都存在着似乎永远也弥补不完的缓冲区溢出漏洞。

图1  缓冲区溢出攻击示意

3、应用ASLR后的一个简单对照样例

以下使用一个比較典型的样例来显示使用ASLR前后的效果:

C源码:

  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. main()
  4. {
  5. char *i;
  6. char buff[20];
  7. i=malloc(20);
  8. sleep(1000);
  9. free(i);
  10. }
  11. #ps -aux|grep test
  12. Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
  13. aslr_test        8731  0.0  0.0   1632   332 pts/0    S+   18:49   0:00 ./test
  14. aslr_test        8766  0.0  0.0   2884   748 pts/1    R+   18:49   0:00 grep test
  15. aslr_test@aslr_test-laptop:~$ cat /proc/8731/maps
  16. 08048000-08049000 r-xp 00000000 08:01 2256782    /home/aslr_test/Desktop/test
  17. 08049000-0804a000 rw-p 00000000 08:01 2256782    /home/aslr_test/Desktop/test
  18. 0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
  19. b7e60000-b7e61000 rw-p b7e60000 00:00 0
  20. b7e61000-b7f9c000 r-xp 00000000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  21. b7f9c000-b7f9d000 r--p 0013b000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  22. b7f9d000-b7f9f000 rw-p 0013c000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  23. b7f9f000-b7fa2000 rw-p b7f9f000 00:00 0
  24. b7fae000-b7fb0000 rw-p b7fae000 00:00 0
  25. b7fb0000-b7fc9000 r-xp 00000000 08:01 12195      /lib/ld-2.5.so
  26. b7fc9000-b7fcb000 rw-p 00019000 08:01 12195      /lib/ld-2.5.so
  27. bfe86000-bfe9c000 rw-p bfe86000 00:00 0          [stack]
  28. ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
  29. #ps -aux|grep test
  30. Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
  31. aslr_test        8781  0.0  0.0   1632   332 pts/0    S+   18:49   0:00 ./test
  32. aslr_test        8785  0.0  0.0   2884   748 pts/1    R+   18:49   0:00 grep test
  33. aslr_test@aslr_test-laptop:~$ cat /proc/8781/maps
  34. 08048000-08049000 r-xp 00000000 08:01 2256782    /home/aslr_test/Desktop/test
  35. 08049000-0804a000 rw-p 00000000 08:01 2256782    /home/aslr_test/Desktop/test
  36. 0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
  37. b7e1e000-b7e1f000 rw-p b7e1e000 00:00 0
  38. b7e1f000-b7f5a000 r-xp 00000000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  39. b7f5a000-b7f5b000 r--p 0013b000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  40. b7f5b000-b7f5d000 rw-p 0013c000 08:01 12116      /lib/tls/i686/cmov/libc-2.5.so
  41. b7f5d000-b7f60000 rw-p b7f5d000 00:00 0
  42. b7f6c000-b7f6e000 rw-p b7f6c000 00:00 0
  43. b7f6e000-b7f87000 r-xp 00000000 08:01 12195      /lib/ld-2.5.so
  44. b7f87000-b7f89000 rw-p 00019000 08:01 12195      /lib/ld-2.5.so
  45. bfe23000-bfe39000 rw-p bfe23000 00:00 0          [stack]
  46. ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

通过两次执行后对照/proc下的进程信息可以发现进程栈和共享库映射的地址空间都有了较大的变化。这使得以往通过esp值来推測shellcode地址的成功率大大减少了。Phrack59期有一篇文章介绍过使用return-into-libc的方法突破ASLR保护。只是存在着较大的条件限制。milw0rm的一篇文章也介绍了通过搜索linux-gate.so.1中的jmp %esp指令从而转向执行shellcode的方法,只是因为如今的编译器将要恢复的esp值保存在栈中,因此也不能继续使用。总的来说,ASLR技术可以非常好地保证Android代码及执行安全。

如何处理Android中的防缓冲区溢出技术的更多相关文章

  1. 转:"在已损坏了程序内部状态的XXX.exe 中发生了缓冲区溢出"的一种可能原因

    我的问题跟原作者的问题差不多.头文件和DLL不匹配导致的. 原文链接:http://blog.csdn.net/u012494876/article/details/39030887 今天软件突然出现 ...

  2. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

  3. Linux下缓冲区溢出攻击的原理及对策(转载)

    前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...

  4. Linux下缓冲区溢出攻击的原理及对策

    前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈 帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实 ...

  5. 缓冲区溢出基础实践(二)——ROP 与 hijack GOT

    3.ROP ROP 即 Return Oritented Programming ,其主要思想是在栈缓冲区溢出的基础上,通过程序和库函数中已有的小片段(gadgets)构造一组串联的指令序列,形成攻击 ...

  6. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  7. Linux Exploit系列之一 典型的基于堆栈的缓冲区溢出

    Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出) Note:本文大部分来自于看雪hackyzh的中文翻译,加入了一些自己的理解 典型的基于堆栈的缓冲区溢出 虚拟机 ...

  8. Android中插件开发篇总结和概述

    刚刚终于写完了插件开发的最后一篇文章,下面就来总结一下,关于Android中插件篇从去年的11月份就开始规划了,主要从三个方面去解读Android中插件开发原理.说白了,插件开发的原理就是:动态加载技 ...

  9. Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞

    漏洞名称: Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-068 发布时间: 2 ...

随机推荐

  1. 如何调试 Android 上 HTTP(S) 流量

    http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/ 如何调试 Android 上 HTTP(S) ...

  2. 网络拥塞控制(七)BIC-TCP

    转自:http://www.cnblogs.com/fll/archive/2009/02/24/1397592.html 上面我们已经提到了HSTCP,它通过简单的修改标准TCP的增长方式,从而达到 ...

  3. 同一个账号启动两个resin而要求使用不同jdk的解决方法

    天,一个老同事问起这样一个问题,起因是他们的系统由于某些原因原有的部分模块不能运行在新的jdk下,所以需要启动两个resin并使用不同jdk.由 于是要开机自动启动,因此启动的账号还需要是同一个.这样 ...

  4. iOS酷炫动画效果合集

    iOS酷炫动画效果合集 源码地址 https://github.com/YouXianMing/Animations 效果绝对酷炫,包含了多种多样的动画类型,如POP.Easing.粒子效果等等,虽然 ...

  5. Smali基本语法

    .field private isFlag:z 定义变量 .method 方法 .parameter 方法参数 .prologue 方法开始 .line 12 此方法位于第12行 invoke-sup ...

  6. Check failed: mdb_status == 0 (13 vs. 0) Permission denied

    文件权限问题. chown或者chmod即可 另外注意lmdb文件的权限

  7. Jackcess 1.2.13 发布,Java 访问 Access 数据库

    Jackcess 1.2.13 包含新的方法用于在数据库和附件内容解码中查找复杂值类型的关系,修复了 CodeHandler 相关的一些小 bug. Jackcess 是一个Java 类库,用来读写微 ...

  8. 用java打暴雪星际争霸(2)——执行測试机器人

    原创内容.转载请注明. 在上一节安装完成后.或者您直接打开我分享的虚拟机后,我如今将解说怎样启动測试机器人. 第一步,打开Eclipse,导入机器人演示样例项目,如图所看到的. 第二步,我们能够看到就 ...

  9. 【转】你真的懂select Socket模型吗?

    转自:http://www.cppblog.com/xvsdf100/archive/2013/12/10/204689.html     只要接触过c/c++网路编程人都可能会知道select io ...

  10. CentOS中zip压缩和unzip解压缩命令详解

    以下命令均在/home目录下操作cd /home #进入/home目录1.把/home目录下面的mydata目录压缩为mydata.zipzip -r mydata.zip mydata #压缩myd ...