tcache_attack
tcache_UAF
tcache_UAF_level_1
- 题目来源:BUUCTF在线评测,[BJDCTF 2nd]ydsneedgirlfriend2
tcache_UAF_level_1_分析1
- 先
check
一下题目附件,发现没有开启pie
保护。
-
然后对该附件进行逆向分析,使用
IDA pro
将该附件反编译,得到如下结果-
函数的具体执行流程就是先输出菜单,然后要求用户输入选项(输入字符形式的1、2、3、4)
-
然后
atoi
就会将用户输入的字符形式的数字,转换为整型(这个过程就是然用户选择) -
选择1执行
add
操作,选择2执行dele
,选择3执行show
,选择4执行exit
-
-
之后就先查看
add()
函数执行的操作-
先检查申请堆块的个数有没超过7个,没操作7个就会先申请一个
0x10
大小的堆块,该堆块后0x8
字节存放打印函数的地址 -
之后申请用户指定的堆块,将该堆块地址,存入之前申请堆块的前
0x8
字节中 -
再向用户可以指定申请的堆块输入内容。
-
最后
count
自增
-
- 这边有两个全局变量
count
(整型的全局变量),girlfriends
(指针类型的全局变量),准确来说是一个指针数组的全局变量有7个元素girlfriends[7]
- 所以整个堆块的结构就如下:
- 接下来查看
dele
- 大致逻辑就是,释放用户指定索引的堆块并且存在
uaf
漏洞
- 大致逻辑就是,释放用户指定索引的堆块并且存在
- 查看
show
函数- 利用函数指针的形式调用自定义函数,输出
girlfriend_name
堆块的内容
- 利用函数指针的形式调用自定义函数,输出
- 还发现有一个后门函数,可以直接
getshell
tcache_UAF_level_1_分析2
- 这题的基本思路就是通过
UAF
漏洞,将0x10
的那个堆块,申请到用来写入name
的堆块,然后我们修改print_girlfriend_name
的地址为backdoor
的地址,之后再通过show
调用print_girlfriend_name
的地址,实际上我们去调用的是backdoor
。 - 通过动态调试发现,只有
girlfriend[0]
这个可以输出内容和释放堆块。
- 所以我们一开始要申请一个
size
位不是0x20
的堆块,再释放这两个堆块,此时girlfriend[0]
没有置0,就会导致uaf
。
- 当我们再次申请一个堆块的时候就会发现,
add
的这一步不会再执行一遍。
- 所以当我们再次申请一个
size
为0x20
大小的堆块,就会将girlfriend[0]
所指向的堆块申请回来,我们这时就可以对该堆块进行修改。直接将该堆块修改为backdoor
函数的地址,再调用show
函数就可以getshell
tcache_UAF_level_1_exp
- exp如下:
1 | from pwn import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!