• 趁热打铁,刚刚学完unlink机制,再会过头来看长城杯的一题模版堆题就感觉很容易,利用的就是UAF漏洞泄露libc地址,然后再劫持malloc_hookonegadget,然后就getshell,现在先来学习unsowrted_bin_attackUAF泄露libc
  • unsorted_bin_attack是对unsorted_bin这个bin的利用方式,但是这个bin的利用方式有好几种,所以就先从最简单的一种开始学习
  • 这种unsorted_bin_attack的利用方式要与其他攻击联系起来才可以发挥作用,单单泄露libc地址有的题目用处可能不大

堆再介绍

  • 当我们申请一个比较大的堆块时,该堆块被free后不会被放入fast_bin中,而是被放入unsorted_bin,而unsorted_bin位于glibc中的main_arena中的bins这个地方即main_arena+88

image-20241015085716540

image-20241012142511059

  • main_arena的结构大致如下:

image-20241012144414362

  • unsorted_bin链表管理方式:在unsorted_bins中,这个链表的管理方式为双向循环链表,并且unsorted_bin也是用于fd、bk指针的,就像下图

image-20241015085716540

  • 所以unsorted被管理的堆块就像下图这样(这里就不像unlink那样标明高低地址了):

image-20241015091023484

示例程序

  • 实验环境:Docker,ubuntu16.04,工具gcc,glibc2.23,pwngdb

实验1

  • 实验程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<malloc.h>
int main()
{
long long unsigned int *p1;
p1 = (long long unsigned int *)malloc(0x100);
malloc(0x100);
*p1 = 1111;
free(p1);
printf("%p\n",*p1);
return 0;
}
// gcc -o lab_1 lab_1.c

分析1

  • 编译好后使用gdb进行动态调试,使用ni命令将程序运行到第二个malloc之后,free之前,使用heap -v查看堆块
  • 发现我们申请了俩个堆块,都是0x110大小的堆块,这个大小的堆块free之后是会被放入

image-20241015091635932

image-20241015092159509

  • 然后再使用ni指令,将程序运行到free之后printf之前,我们发现在free之后被free的堆块被放入了unsortedbin中,然后他的fdbk指针都指向unsorted_bin这个地方

image-20241015092247172

  • 再使用p main_arena命令查看一下对应的unsorted_bin中的地址,unsorted_binfdbk指针也都指向被free的堆块

image-20241015092545872

  • 然后我们再使用ni指令,将程序运行到printf之后,查看一下输出了什么,发现是输出了fd指针的值,即unsored_bin的地址

image-20241015092758566

image-20241015092815347

  • 现在unosrted_bin的地址知道了,即main_arena+88的地址知道了,该地址在glibc中的偏移了,但是main_arena在glibc的偏移不好找,而通过动态调试我们会发现,main_arena-0x10这个地址刚好是malloc_hook的地址,所以我们通过malloc_hook的偏移,去找到从而得到glibc的基地址。

总结1

  • 在堆块中如果有UAF漏洞,这样我们就可以先申请一个堆块chunk0(要保证堆块free后被放入unsorted_bin),再将chunk0释放掉
  • 这时chunk0的fd、bk指针更新指向unsorted_bin,我们再使用一个show函数那么不就可以泄露main_arena的地址即泄露libc地址了