初遇tcache-double_free
ciscn_2019_es_1
要点:
- 虽然说tcache的double free漏洞在glibc2.30之后才完备,但是glibc2.27中也有版本具备该检测
- 我最开始用的2.27-3ubuntu1.5_amd64就是不可以的,但是此题目是没有该检查的,本地测试可以用2.27-3ubuntu1_amd64
ida速览
- 经典的堆菜单,但是glibc2.27具有tcache
1 | int __fastcall __noreturn main(int argc, const char **argv, const char **envp) |
add
1 | // 类似形成一个结构体 |

show

call(free)
- 很明显的uaf漏洞

简单分析
- 漏洞点很明显,有uaf漏洞,free掉的指针没有清零
- 先malloc(0x410) 绕过tcache进入unsorted bin,然后直接show就可以泄露libc,也可以malloc(0x80),然后free8次,再show也是可以的,是因为此题目没有double free检查
- 然后double free改free_hook为system,就差不多了,跟之前一样的步骤
gdb动调
绕过tcache+泄露libc
1 | add(0x410,b'aaaa',b'0')# 绕过tcache进入unsortedbin |
- 先malloc(0x410)(>0x408)绕过tcache,后面两个malloc是为了修改free_hook和最后的getshell
- free(chunk0)之后,如下,此时fd和bk指向的是main_arena+96,而不是88了

- 由于此时的指针没有清零,可以直接show,泄露libc
double free+getshell
1 | # glibc2.30才有的double free的检查 |
- double free之后:

- 第一次add:
修改了tcache bin中chunk的fd指针,指向__free_hook,只需要两次malloc就可以malloc到free_hook,进行修改

- 第二次add(无用的chunk):

- 第三次add:
可以看到__free_hook指向了system,调用free->free_hook->system

- 最后直接free(2)即可,相当于system(“/bin/sh”)
完整EXP
1 | from pwn import * |
- 标题: 初遇tcache-double_free
- 作者: D0wnBe@t
- 创建于 : 2024-09-22 20:06:12
- 更新于 : 2024-09-22 21:26:39
- 链接: http://downbeat.top/2024/09/22/初遇tcache-double-free/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论