手动编译测试musl1.2.2 meta dequeue特性

VSole2022-10-11 17:09:35

一、基础知识

https://bbs.pediy.com/thread-269533-1.htm#msg_header_h3_8

师傅写的很好,研究一下午就大致能了解透彻musl 1.2.2的内存管理结构和机制。美中不足的是没讲讲怎么编译一个用musl libc的程序。本文就简单介绍介绍如何编译一个musl libc下的程序,并通过它简单调试调试musl libc 的一些特性。

安装musl环境&&符号表

这里直接用0xRGz师傅的做法。

下载.deb安装包(0xRGz师傅的链接在笔者的电脑上貌似失效了):http://ftp.de.debian.org/debian/pool/main/m/musl/musl_1.2.2-1_amd64.deb

安装:

sudo dpkg -i musl_1.2.2-1_amd64.deb

安装调试符号:

下载安装包musl-dbgsym_1.2.2-1_amd64.ddeb(https://launchpad.net/ubuntu/+archive/primary/+files/musl-dbgsym_1.2.2-1_amd64.ddeb

安装:

sudo dpkg -i musl-dbgsym_1.2.2-1_amd64.ddeb

安装gdb小插件(from xf1les 师傅):

git clone https://github.com/xf1les/muslheap.gitecho "source /path/to/muslheap.py" >> ~/.gdbinit

(这里的/path/to是需要修改的,也就是你git的muslheap的路径。安装了这个就能使用mheap和mchunk等一些非常好用的辅助调试的命令)

二、手动编译第一个musl程序

下载&&安装

curl -LO http://musl.libc.org/releases/musl-1.2.2.tar.gztar vxf musl-1.2.2.tar.gzcd musl-1.2.2./configure --prefix=/usr/local/musl CFLAGS='-O2 -v'make && sudo make install

源码&&编译

(在musl-1.2.2目录下的操作)

main.c:

#include <stdio.h> int main() {    printf("Hello musl libc\n");    return 0;}

编译:

./obj/musl-gcc main.c -o test

链接:

patchelf --set-interpreter ./libc.so ./test

运行

三、测试

demo1

#include<stdio.h>#include <unistd.h> void init(){        setbuf(stdin, 0);        setbuf(stdout, 0);        setbuf(stderr, 0);} int main() {         init();        size_t *p1,*p2,*p3;        p1=(size_t *)malloc(0x20);        p2=(size_t *)malloc(0x30);        p3=(size_t *)malloc(0x40);        read(0,p1,0x10);        read(0,p2,0x20);        read(0,p3,0x30);        free(p1);        free(p2);        free(p3);        return 0;}

通过read我们就能定位到分配的chunk的地址,从而通过mchunk看出对应的group和meta。然后通过mheap中的active看出对应的meta有没有被dequeue。

初始状态

malloc p1后

发现多了一个meta(其实是先多一个chunk,然后多一个group再多一个meta)。

malloc p3后

多了两个meta。

mchunk p1

到read看见p1的addr:

mchunk它:

可以看见它的group的首地址是它的地址减0x10,和文章里写的一样,并且group的首地址存了meta的地址。

p (struct meta ) 这个地址看看:

发现这个meta此时是指向自己的,并且mem存的是group的地址(发现meta有东西指向group,group也有东西指向meta)。

avail_mask为1022是因为它的二进制表示为:

01111111110

freed_mask记录group中已经被free释放的堆块,当前没有任何被释放的堆块,所以它为0。

last_idx为9表示group中最多10个同大小的堆块(0~9)。

free_able为1表示当前有一个堆块能free。

sizeclass为2 表示由0x2这个group进行管理这一类的大小的chunk。

maplen为0说明这个group不是通过mmap分配的。

看看group中的chunk

0x70本来是chunk头,结果被last_idx和meta_addr占位了,从0x80开始是我们读入的数据“nameless”。

free chunk过后看看:

发现active[2]不见了。这其实触发了meta dequeue的第一个条件——在free的时候,group中只有一个堆块处于使用状态中即free它过后,group中的所有堆块都处于未使用状态。这个时候还留它干嘛呢,直接将该meta dequeue了。

demo2

通过demo1简单了解了gdb下musl 的chunk、group和meta怎么调试,以及meta dequeue的第一种触发方式。接下来我们调试调试meta dequeue第二种触发方式——malloc的时候。

源码:

#include<stdio.h>#include <unistd.h> void init(){        setbuf(stdin, 0);        setbuf(stdout, 0);        setbuf(stderr, 0);} int main() {         init();        size_t *p1;        p1=(size_t *)malloc(0x20); //1        p1=(size_t *)malloc(0x20); //2        p1=(size_t *)malloc(0x20); //3        p1=(size_t *)malloc(0x20); //4        p1=(size_t *)malloc(0x20); //5        p1=(size_t *)malloc(0x20); //6        p1=(size_t *)malloc(0x20); //7        p1=(size_t *)malloc(0x20); //8        p1=(size_t *)malloc(0x20); //9        p1=(size_t *)malloc(0x20); //10        p1=(size_t *)malloc(0x20); //11        p1=(size_t *)malloc(0x20); //12        p1=(size_t *)malloc(0x20); //13        p1=(size_t *)malloc(0x20); //14         return 0;}

测试

发现当malloc第10个堆块过后,active[2]就从0x298变成0x2c0即发生了meta dequeue。

而且group的位置也从0xc70变成了0xc50。这说明在这种dequeue的时候,会产生一个新grep,以及对应的meta。

学meta dequeue有啥用呢?

做题!(即答)

别别别,ctf to learn,not learn to ctf

我们从p (struct meta ) 能看出来meta是一个双链表结构,dequeue的过程就牵扯到一个类似UB或者large bin chunk 的unlink的操作。就有可能通过这里的dequeue实现unlink 任意地址写,但具体怎么操作就留给读者思考或者看其它大师傅博客复现赛题了。(笔者写这篇的时候还没做任何一道musl 1.2.2的题,虽然确实是奔着做题去学的,不过搞嵌入式的话不会arm,不会musl怎么行呢?)

一些话

纸上得来终觉浅,绝知此事要躬行,觉得在正式做题之前还是要自己写个demo简单调调,检验检验自己是否学懂了musl 1.2.2的特性。不能总想着做题……

meta编译程序
本作品采用《CC 协议》,转载必须注明作者和本文链接
使用AFL++复现历史CVE
2022-08-12 17:36:45
安装调试目标从github等途径下载并解压。从网上找现成的样本sample。
Thymeleaf SSTI漏洞分析
2021-11-11 12:56:34
要了解SSTI漏洞,首先要对模板引擎有所了解。下面是模板引擎的几个相关概念。 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档。 模板引擎的本质是将模板文件和数据通过模板引擎生成最终的HTML代码。 模板引擎不属于特定技术领域,它是跨领域跨平台的概念。 模板引擎的出现是为了解决前后端分离
Android逆向:基础入门
2022-06-03 05:29:40
前言 随着app的广泛应用,使用过程中,难免会遇到些很不友好的功能,比如:游戏充值、间断性弹窗广告、续费解锁下一回等等。
最常见的情况是使用 Tomcat 作为 Java Web 服务器,使用 Spring 提供的开箱即用的强大 的功能,并依赖其他开源库来完成负责的业务功能实现
Java安全中Groovy组件从反序列化到命令注入及绕过和在白盒中的排查方法
随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP,属于一种新型应用安全保护技术,它将防护功能“ 注入”到应用程序中,与应用程序融为一体,使应用程序具备自我防护能力,当应用程序遭受到实际攻击伤害时,能实时检测和阻断安全攻击,而不需要进行人工干预。实现了在攻击链路最关键的地方阻断攻击。
Meta Platforms 近日采取了一系列措施制裁来自意大利、西班牙和阿拉伯等多国的八家间谍软件公司,分别是 Cy4Gate/ELT Group、RCS Labs、IPS Intelligence、Variston IT、TrueL IT、Protect Electronic Systems、Negg Group 和 Mollitiam Industries。
大型语言模型(LLM)技术近年来取得了巨大进步,但其背后却隐藏着版权纠纷的阴云。科技巨头们利用海量文本数据训练 LLM,其中难免会涉及到受版权保护的作品,招致作者和媒体组织的强烈抗议。
欧洲数据保护委员会延长了挪威数据保护局 (DPA) 于 7 月实施的对 Facebook 和 Instagram 定向广告的临时禁令。
Meta推出新模型,Humpback击败现有全部LLaMa模型
VSole
网络安全专家