安全编码实践之五地址空间格局随机化ASLR.doc

安全编码实践之五地址空间格局随机化ASLR.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
安全编码实践之五地址空间格局随机化ASLR

安全编码实践之五地址空间格局随机化ASLR 安全编码实践之五地址空间格局随机化ASLR2010-04-26 10:421.概述 在前面安全编码实践中我们介绍过GS编译选项和缓存溢出,以及数据保护DEP。首先,缓存溢出的直接后果就是可能导致恶意代码的远程执行,于是编译器提供了GS保护。但是,GS选项有自身的局限,存在若干方法可以绕过GS选项的保护。于是进一步,操作系统提供了数据执行保护,即DEP,以及与之对应的NXCOMPAT编译选项。 那么是不是现在我们就可以高枕无忧了?在安全领域中,系统的攻防是一个不断发展进化的过程。DEP提出后,就出现了针对DEP的Ret2libc攻击手段。这一点我们曾在介绍DEP的安全编码实践文章的最后简单提及过。 ASLR(Address Space Layout Randomization),地址空间格局的随机化,就是用来防范Ret2libc攻击手段的另一个重要的安全特性。那么,什么是Ret2libc攻击,ASLR的原理是什么,开发人员如何使用这个安全特性,就是我们这篇文章要探讨的内容。 2.DEP和Ret2libc攻击 2.1 DEP对堆栈溢出的保护 在栈溢出介绍中提及到Windows体系结构下函数堆栈布局(地址从高向低)如下: 调用参数返回地址EBP上层函数堆栈基址异常处理代码入口地址 (如果函数设置异常处理)局部变量 表1:Windows系统的函数堆栈结构 如果发生堆栈溢出,恶意代码通过覆盖在堆栈(stack)上的局部变量,从而修改函数的返回地址,而导致恶意代码执行。下面是这类攻击方式的堆栈结构的一个典型例子。 调用参数覆盖方向-恶意代码返回地址恶意代码的入口地址EBP上层函数堆栈基址溢出的变量覆盖区域,往往包括必要的填充字节异常处理代码入口地址 (如果函数设置异常处理)局部变量 表2:堆栈溢出时的堆栈结构 当DEP保护机制被使用后,由于恶意代码是存放在系统的数据页面(堆栈页面上),那么函数返回时,指令寄存器EIP将跳转到恶意代码的入口地址。此时该页面是非可执行的(non-executable),于是DEP就会触发系统异常而导致程序中止。 2.2 Ret2libc攻击 在上述的DEP保护机制中,可以看到关键是在函数返回时EIP跳转到了非可执行页面时被DEP检测到。那么Ret2libc的攻击原理是,攻击者设定的函数的返回地址并不直接指向恶意代码,而是指向一个已存在的系统函数的入口地址。由于系统函数所在的页面权限是可执行的,这样就不会触发DEP异常。 那么,攻击者应该将EIP控制指向那个特殊的系统入口函数?一个例子是在Unix系统下,libc是一个共享的C动态执行库,里面有许多非常有用的函数,例如system函数。它的定义如下: int system(const char*string); 函数system()可通过运行环境来执行其它程序,例如启动Shell等等。那么,攻击者就可以通过构造以下的堆栈结构【1】: 调用参数覆盖方向-/bin/sh虚假的返回地址返回地址system函数的入口地址EBP上层函数堆栈基址溢出的变量覆盖区域,往往包括必要的填充字节异常处理代码入口地址 (如果函数设置异常处理)局部变量 表3:Ret2libc攻击的堆栈结构 这样,当发生堆栈溢出的函数返回时,EIP跳转到system函数。因为system函数本身就是可执行的,这时不会产生DEP异常。攻击者通过构造system函数的调用参数来可以启动其它程序。在攻击过程中,函数返回到libc库(return to libc)是关键,这也就是Ret2libc名字的来由。 细心的读者也许已经发现,在表3中,没有任何恶意代码被插入。攻击者虽然可以通过system或者其它系统函数来执行很多敏感的操作,但在多数情况下,还是更希望可以执行自身定制的恶意代码。如何可以做到这一点?于是在最初的Ret2libc的攻击方式的基础上,又发展出特别针对Windows系统攻击的手段。它的原理是通过VirtualProtect函数来修改恶意代码所在内存页面的执行权限,然后再将控制转移到恶意代码。 VirtualProtect是Windows系统kernel32.dll提供的函数,其功能是修改调用进程所在虚拟地址空间(virtual address)的内存区域的保护权限。它的定义如下: BOOL WINAPI VirtualProtect( __in LPVOID lpAddress, __in SIZE_T dwSize, __in DWORD flNewProtect, __out PDWORD lpflOldProtect ); 攻击者构造以下的堆栈结构【2】来调用VirtualProtect: 调用参数覆盖方向-恶意代码lpflOldProtect

文档评论(0)

feixiang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档