绕过 ASLR -- 第三部分
漏洞代码
// vuln.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv) {
char buf[256];
int i;
seteuid(getuid());
if(argc < 2) {
puts("Need an argument\n");
exit(-1);
}
strcpy(buf, argv[1]);
printf("%s\nLen:%d\n", buf, (int)strlen(buf));
return 0;
}
编译命令
#echo 2 > /proc/sys/kernel/randomize_va_space
$gcc -fno-stack-protector -o vuln vuln.c
$sudo chown root vuln
$sudo chgrp root vuln
$sudo chmod +s vuln
1.首先使用覆盖GOT表的方法
找到add到某一地址的指令。这里ebx+0x5d5b04c4为目的地址,eax为要放进去的值
找到getuid的got表地址,为即将替换的值
from pwn import *
context.log_level = 'debug'
vuln = ELF('./vuln')
getuid_got = vuln.got['getuid']
print "getuid_got_addr:"+hex(getuid_got)
ebx = getuid_got - 0x5d5b04c4
找到修改ebx的gadget
但是遗憾的是没有关于eax的pop。因此GOT覆盖无法完成。
相应查找 call指令相关的都与eax有关,而又无法控制EAX,因此解GOT引用也无法完成。
虽然在该二进制文件中无法使用该两种方法,但是不排除在某些特定的场景中可以使用。
对于该二进制文件仍然可使用之前的方法。