ciscn_2019_n_3 Writeup
基本堆UAF
前提
- 本程序中的释放堆块后未对堆块指针置空,从而可能引发UAF。
- 程序本身带有函数
system()
,可以直接使用system@plt
的方式使用该函数。 - 涉及堆块结构的代码如下下文所示,第一种块大小固定位0x10(0x11),有一种块大小可控,最大为0x400。
1 | //当堆块结构是integer时 |
思路
- 申请三个类型为integer的块0、1、2。大小为固定的0x10。
- 释放块0、1。
- 重新申请一个类型为text的块,大小指定为0xc以下。按照tcache bin先进先出的结构,bin中的块1与0被依此分配,且可以对块1进行写操作,让指定位置的内容被覆盖为指定的内容。
- 对块0的
*(_DWORD *)v3
区域覆盖数据为sh/0/0
。这是因为长度不足以输入/bin/sh
,且要考虑程序流程引发的\a
。 - 对块0的
(_DWORD *)(v3 + 4)
区域覆盖数据为system@plt
。
- 对块0的
- 释放块0即可获得shell。
- 这是因为本程序的释放操作是使用指定块的
(_DWORD *)(v3 + 4)
区域内的自定函数完成的。该函数的结构如上文所示。
- 这是因为本程序的释放操作是使用指定块的
完整exp
1 | from pwn import * |
ciscn_2019_n_3 Writeup