【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. skb的两个函数pskb_copy和skb_copy

    转自:http://blog.csdn.net/farmwang/article/details/54235252 skb的两个函数pskb_copy和skb_copy 前者仅仅是将sk_buff的结 ...

  2. log4j1 修改FileAppender解决当天的文件没有日期后缀

    直接上代码: /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license ...

  3. SharePoint JavaScript API in application pages

    前言 最近,在SharePoint 应用程序页中写JavaScript API,进行一些数据交互.其实,很简单的事情却遇到了问题,记录一下,希望能对遇到类似问题的人以帮助. 引用JavaScript ...

  4. Java并发编程的艺术(十)——线程池(1)

    线程池的作用 减少资源的开销 减少了每次创建线程.销毁线程的开销. 提高响应速度 每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度. 提高线程的可管理性 线程是一种稀缺资 ...

  5. 开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用

    这篇其实没啥重要的,主要就算是个总结吧. 一.布局文件 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定 ...

  6. [Android Security] 静态分析Android程序——smali文件解析

    cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036. ...

  7. Curl操作Elasticsearch的常用方法

    Elasticsearch对于文档操作,提供了以下几种API,本文就说明如何使用curl方式来调用这些API. API种类 单文档操作API 1.* Index API 索引文档 * 为文档创建索引 ...

  8. YAML文件简介

    编程免不了要写配置文件,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. 本文介绍 YAML 的语法,以 JS-YAML 的实现为例.你可以去 ...

  9. spring boot成功启动后访问报错404的问题

    Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as ...

  10. Hadoop集群WordCount运行详解(转)

    原文链接:Hadoop集群(第6期)_WordCount运行详解 1.MapReduce理论简介 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对 ...