多线程pwn(ptmalloc)
参考文章:ptmalloc堆概述-多线程支持_ptmalloc主arena存在的意义-CSDN博客
推荐(讲得很清晰):ptmalloc源码分析 - 主分配区和非主分配区Arena的实现(04)_malloc main arena-CSDN博客
参考文章:ptmalloc堆概述-多线程支持_ptmalloc主arena存在的意义-CSDN博客
推荐(讲得很清晰):ptmalloc源码分析 - 主分配区和非主分配区Arena的实现(04)_malloc main arena-CSDN博客
io_file相关学习有点蛋疼 感觉较为复杂 找到了大佬的blog感觉摸到了皮毛 为了深入
题目中存在off_by_one libc版本2.34以上我们没办法使用常规的overlapping 泄露libc地址
所以我们要精心构造一个chunk head来绕过新版本的检查机制 实现leak libc的操作
文章中我们先讲原理 在最后会将Arahat0师傅的脚本给出来()
2.34下的合并检查机制
unlink检查
主要是看着wiki 理解理解 然后自己看的glibc2.27的源码 抛开tcache部分
这里是去除了不重要的
tcache bin
判断部分
if (in_smallbin_range (nb)){
idx = smallbin_index (nb);
bin = bin_at (av, idx);
if ((victim = last (bin)) != bin)
{
bck = victim->bk;
if (__glibc_unlikely (bck->fd != victim))
malloc_printerr ("malloc(): smallbin double linked list corrupted");
set_inuse_bit_at_offset (victim, nb);
bin->bk = bck;
bck->fd = bin;
if (av != &main_arena)
set_non_main_arena (victim);
check_malloced_chunk (av, victim, nb);
void *p = chunk2mem (victim);
alloc_perturb (p, bytes);
return p;
}
}
昨天做vctf被打自闭了 由于对glibc高版本的保护不熟悉 第二题apples 连leak libc都没实现
这里记录一下为什么常规overlapping会失效
首先是add user部分 存在off_by_one漏洞
delete部分无懈可击()
参考文章:
wiki:Large Bin Attack - CTF Wiki (ctf-wiki.org)
源码级调试glibc:源码级调试glibc_glibc cannot be compiled without optimization-CSDN博客
源码分析:glibc 2.31 malloc与free 源码分析(持续更新) - PwnKi - 博客园 (cnblogs.com)+glibc malloc源码分析 - PwnKi - 博客园 (cnblogs.com)
详细拆分了_int_malloc的流程 并且按照功能分了标题 想要了解对应部分就直接点击标题跳转即可
第一次阅读glibc的源码然后进行分析 有错误的地方请大佬指正
由于做题的时候老是脑子不够用 无法根据malloc(num)中的num获取chunk的size 所以我就决定自己写一个程序来完成这个工作并且好好理解一下怎么计算的
最小chunk
为0x20
chunk
一定是size_sz *2
的倍数(内存对齐)
chunk
可以占用下一个chunk
的prev_size
来存东西
所以我们就是看是否malloc的大小 +size
所占字节数 然后是否内存对齐 如果没有则加到对齐 然后 判断最后的size是否小于0x20 如果小于则直接等于0x20
所以直接使用公式:(num + 8 +0xf)&~0xf; 其中num就是我们malloc传的参数
做hgame的时候 有点做不动heap的题 所以来学习一下基本功
学习文章:【pwn】学pwn日记(堆结构学习)(随缘更新)_pwn 堆特性-CSDN博客
在linux中 堆管理器 由libc.so.6链接库实现
brk
mmap
brk
函数
mmap函数
一般申请较大的内存空间 从shared libraries
里面开新的空间
子线程只能用mmap函数
查看glibc的源码网址:https://elixir.bootlin.com/glibc/glibc-2.23/source/malloc/malloc.c
print (void)arch_prctl(option_num,addr)
主要是看NTUSTISC
tcache在libc2.31里面引用了key检查 然后在malloc的时候没有检查
size
其次tcache的fd指向的是chunk data
double free