DASCTF_BUUCTF_May_pwn_wp
目录
注意
本文最后更新于 2021-05-29,文中内容可能已过时。
能在buuctf
上打比赛还是很舒服的,两道pwn
题比较基础,wp
就随便写一下啦!
1、ticket
checksec
运行环境为ubuntu16.04
,libc-2.23.so
题目分析
常见的菜单题,这里主要分析一下bss
段的数据分布:
需要注意的地方有:
- 可以添加
0≤ idx <=5
的ticket
堆块,但是只能删除idx < 3
的ticket
堆块 - 基本上围绕
ticket
的操作都是以heap_size
来进行判断的,而且释放堆块后对应的大小会置为0
edit_info
和show_info
似乎并没有什么用
漏洞分析
漏洞点在于两个地方,都在del_ticket
函数中。
第一处是未校验索引大小,使得索引可以为负数。
第二处是存在UAF
,可以利用残留信息泄露出libc
地址。释放堆块的时候只把存储size
的地方置为了0
,指针没有置空。
利用思路
在bss
堆布局可以看到,age
的值可控,因此可以将age
写为bss
地址,然后释放掉bss_fake_chunk
,控制索引为2
、3
的chunk
的大小,可以越界写。
利用步骤即为:
- 利用
unsorted bin
残留的信息泄露出libc
地址 - 利用
del_ticket(-3)
释放bss_fake_chunk
- 控制
chunk
的大小,使得能越界写chunk
- 利用越界写,构造一个
freed 0x70
大小的chunk
,修改其fd
为__malooc_hook - 0x23
- 利用
realloc + one_gadget
来获取shell
最终exp
调试过程:
释放假的chunk
:
越界修改fd
:
修改realloc_hook
和malloc_hook
:
|
|
远程打:
2、 card
checksec
运行环境为ubuntu18.04
, libc-2.27.so
题目分析
写得花里胡哨的菜单题,有malloc
、free
、edit
、show
功能,先来看bss
段布局:
分布很简单,左边存储用户输入的大小,右边存储分配的指针
需要注意的有:
- 所有的
chunk
的大小限定在0-256
之间 - 根据
libc
判断出来堆会使用tcache bin
机制
漏洞分析
call
函数存在一个off by one
:
可以直接把0-256
之间的每个数带进去算一遍,很多数都会使得v0+v1 = v0+1
,部分数会让v1
计算得到0
。
利用思路
带有tcache bin
机制的off by one
,直接利用unlink
,搞个0x90---0x20---0x90
的三明治,然后覆盖__free_hook
为system
,释放带有/bin/sh
的块即可获得shell
。
详细利用步骤为:
- 填满
0x90
大小的tcache bin
- 构造三明治布局,
0x90---0x20---0x90
- 利用
off by one
和unlink
,得到0x140
的块,并包含释放状态的0x20
的堆块 - 利用堆残留指针泄露出
libc
地址 - 修改
freed chunk 0x20
的fd
指针为__free_hook
地址 tcache bin posioning
覆盖__free_hook
为system
地址- 释放带有
/bin/sh
的块获取shell
最终exp
调试过程:
off by one
修改pre_inuse
位:
unlink
:
泄露地址并修改fd
指针:
|
|
远程打:
博客地址
Buy me a coffee~
支付宝
微信