tcache_attack
tcache_UAF
tcache_attack就直接放在一起写
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 * |

总结
练习
tcache_house_of_spirit
- 这个的实验就不介绍了,在之前已经介绍过该实验了
- 直接寻找对应的练习题。
tcache_stashing_unlink_attack
实验
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

