商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 网络安全渗透测试之musl堆利用技巧

网络安全渗透测试之musl堆利用技巧

  发布于2026-07-22 阅读(0)

扫一扫,手机访问

前言

最近比赛中musl题型的出现频率越来越高,想要应对接下来的比赛,musl堆利用这块就得补上。这篇文章瞄准的是musl 1.2.2版本,网上有很多讲源码审计的文章,我们换条路——通过一道真题来debug,边调边学堆的利用技巧。选的是2021第五空间线上赛的notegame,实操性更强些。

题目分析

1、add函数用的是calloc,最大申请大小是0x90。

网络安全渗透测试之musl堆利用技巧

2、delete函数在free之后把指针清空了,干净利落。

网络安全渗透测试之musl堆利用技巧

3、edit函数是漏洞的藏身之处,存在溢出空字节的问题,利用它可以对index清零,进而指向一个伪造的meta。

网络安全渗透测试之musl堆利用技巧

4、再来看update函数。realloc会把原chunk的内容搬到新chunk里,借助这个机制能泄露libc地址。

网络安全渗透测试之musl堆利用技巧

调试分析

musl的chunk和glibc最大的不同在于:chunk头里存放的堆块信息很少,没有像glibc那样直接挂着指针地址。要想泄露libc地址,就得满足特定条件——chunk里必须恰好保存着另一个chunk的指针或其他地址信息。而且不能像glibc那样直接改指针实现任意分配,只能通过修改chunk头里仅有的几个字段,伪造meta来达到任意分配的效果。

malloc_context

add(0x20,'a'*0x20)

网络安全渗透测试之musl堆利用技巧

1、secret是一个校验meta域的key。

2、free_meta_head存放着释放掉的meta,单链表结构,目前还没释放过,所以为空。

3、active是按照size分类的不同meta链表。

4、usage_by_class记录对应meta的数量。

meta

add(0x20,'a'*0x20)add(0x20,'a'*0x20)add(0x20,'a'*0x20)add(0x20,'a'*0x20)free(3)

网络安全渗透测试之musl堆利用技巧

1、prev和next分别是上一个和下一个meta页,这里都指向自身,说明只有一个meta页。

2、mem表示group的起始地址,一个group由多个chunk组成。

3、a vail_mask记录当前可以分配的chunk情况。0x3f0 = 0b01111110000,已经分配了4个堆块,所以前4位不可分配。

4、freed_mask记录已释放的chunk情况。我们释放了第一个chunk,所以这里0x1对应的就是它。

5、last_idx表示最后一个chunk的下标,这里是0x9,说明一共有0xa个chunk。

6、freeable统计已释放的堆块个数。

7、sizeclass表示这个group管理的chunk大小类别。

8、maplen如果不为0,表示这个meta是通过mmap分配的内存页数。

chunk

add(0x20,'a'*0x20)add(0x20,'a'*0x20)add(0x20,'a'*0x20)add(0x20,'a'*0x20)free(3)

网络安全渗透测试之musl堆利用技巧

1、偏移量分别对应0x0、0x30、0x60(距离group首地址)。系统根据这个偏移找到对应的meta地址。如果能修改偏移——比如把chunk1的偏移改成0——就能在chunk1-0x10的位置伪造一个meta指针。而chunk1-0x10正好是chunk0的data域,由我们控制。这样就能在任意地址伪造一个meta,前提是这个地址必须0x1000对齐。

2、当前chunk的下标。chunk被free之后会变成0xff。

3、剩余用户空间的大小。chunk头后面4个字节类似glibc的prev_size,可以被上一个chunk复用。所以分配大小和chunk大小的对应关系如下:

0x10:0-0xc
0x20:0xd-0x1c
0x30:0x1d-0x2c
0x40:0x2d-0x3c
...

chunk的分配释放

add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)free(0)add(0x50,'a'*0x50)

网络安全渗透测试之musl堆利用技巧

a vail_mask = 0x10 = 0b10000

freed_mask = 0x1 = 0b00001

musl在chunk释放后不会立即重新分配。这个group里有5个chunk,先申请3个,然后free掉第1个。再次申请时,并不会把第1个chunk拿出来用,而是分配group里的第4个chunk,并让对应的a vail_mask置零。

add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)free(0)free(1)free(2)add(0x50,'a'*0x50)add(0x50,'a'*0x50)

网络安全渗透测试之musl堆利用技巧

a vail_mask = 0x6 = 0b0110

freed_mask = 0x0 = 0b0000

当group里的chunk全部耗尽时,musl会把之前释放的chunk重新分配出来,并把其他chunk对应的a vail_mask置1。

meta的释放

add(0x50,'a'*0x50)free(0)

网络安全渗透测试之musl堆利用技巧

如果只有一个chunk被分配出去(freed_mask=0),这时把它free掉,系统就会回收整块meta空间。

add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)add(0x50,'a'*0x50)free(0)free(1)free(2)free(3)free(4)

网络安全渗透测试之musl堆利用技巧

总结起来就是:当a vail_mask | freed_mask的结果等于满状态时,这个meta就会被释放。

总结

本篇先从调试角度把musl堆块的基本结构梳理了一遍,后续文章再深入讨论如何利用这些结构进行攻击。

本文转载于:https://www.jb51.net/article/238075.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注