【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. Getting OS version with NDK in C c++获得版本号

    http://stackoverflow.com/questions/19355783/getting-os-version-with-ndk-in-c #include <cutils/pro ...

  2. 错误:不小心的VS重命名

    问题再现 不小心勾选了“在字符串中搜索”.

  3. python测试开发django-29.发送html格式邮件

    前言 上一篇已经通过send_mail()函数发送纯文本的邮件,发送成功了,如果我们想发送一个html格式的邮件,如何实现呢? 发送html格式的邮件实际上还是调用send_mail()函数 ,只需多 ...

  4. JS --- trim() 函数

    trim()是一个很适用的方法,作用是去除字符串两边的空白,但是js本身并未提供这个方法,下面介绍js使用trim()的方法. 1.通过原型创建字符串的trim() //去除字符串两边的空白 Stri ...

  5. 罪恶黑名单第四季/全集The Blacklist迅雷下载

    英文全名The Blacklist,第1季(2016)NBC.本季看点:<罪恶黑名单>我们知道:剧情紧接第三季结尾,每个人——Liz,Red以及特别行动组的其他人——似乎都有许多故事可说: ...

  6. JS读取json 文件

    json文件是一种轻量级的数据交互格式.一般在jquery中使用getJSON()方法读取. $.getJSON(url,[data],[callback]) url:加载的页面地址 data: 可选 ...

  7. Orchard模块开发全接触4:深度改造前台

    这里,我们需要做一些事情,这些事情意味着深度改造前台: 1:为商品增加 添加到购物车 按钮,点击后功能实现: 2:商品排序: 3:购物车预览,以及添加 结算 按钮: 4:一个显式 购物车中有*个 商品 ...

  8. Guava BiMap AbstractBiMap

    BiMap BiMap是一个结构,他定义了一个Map结构,代表这个Map的key和value都具有唯一性, 并且可以生成相互联系的反向视图, 反向视图的数据会随着本体BiMap的变更而变更 /* * ...

  9. verilog语法实例学习(8)

    常用的时序电路介绍 在电平敏感的锁存器时钟信号有效期(高电平)期间,锁存器的状态随着输入信号的变化而变化.有时候,我们需要存储器的状态在一个时钟周期只改变一次,这个时候就用到了触发器.触发器(flip ...

  10. AltiumDesigner PCB布局布线过程与技巧

    首先是原理图设计. 原理图设计是前期准备工作,对简单的板子,如果熟练流程,不妨可以跳过.但是对于初学者一定要按流程来,这样一方面可以养成良好的习惯,另一方面对复杂的电路也只有这样才能避免出错.在画原理 ...