# 利用main\_arena泄露libc基址

利用条件

* 有目标主机libc.so
* 可申请和释放 非Fastbin\_chunk

unsorted bin是双向链表结构，在unsorted bin的顶端 32位指向&#x20;

free和malloc操作时，最后free的chunk被链接到链表的头部，则申请chunk则是从链表的尾部开始

1 . 使用pwndbg调试，当unsorted bin中存在多个回收的chunk时，如图，先 free chunk2 及0x804a058 ，再 free chunk1 及0x804a160

![](https://1832246008-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LckC1dmB2Mb2F1Bgx_H%2F-LckmYKMIlqFgFc1GHwN%2F-LckmZ7UT1nM1SmLLbMW%2F6.png?generation=1555596723846137\&alt=media)

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2FOfnsTQClMxataA1U7BUh%2Ffile.png?alt=media)

此时unsorted bin的布局如图：

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2F8Bozb3KpNRz2BFRiWqZQ%2Ffile.png?alt=media)

2 . 当然更好的，当unsorted bin中只存在1个回收的chunk时：

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2FvZrrSpniGo7UQ2m6WMYB%2Ffile.png?alt=media)

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2FRdCIH4US6G2Qh8T5Wvsa%2Ffile.png?alt=media)

fd 与 bk 都指向&#x20;

3 . main\_arena存储在libc.so.6文件的.data段，通过这个偏移我们就可以获取libc的基址，这里我讲一下怎么找到main\_arena的地址，首先使用IDA打开libc文件，然后搜索函数malloc\_trim()，具体如下图所示。

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2FZ6W3d8ivahfQAao8i4G3%2Ffile.png?alt=media)

为什么是这个呢，我们可以对照一下malloc.c的源代码，源代码如下图。

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LckC1dmB2Mb2F1Bgx_H%2Fuploads%2F9VNwsE9HPZagctRQaeOY%2Ffile.png?alt=media)

bingo !

PS：之前演示的是32位程序，64位程序同理，但 64位指向&#x20;
