上周0CTF
临危受命,就做出一道题, 感觉思路很新颖, 分享一下.
1. checksec
结论: 保护全开, 必是堆溢出之类的.
2. 结构体
3. 菜单
4. Allocate(可以申请最大0x58字节的内存)
5. Update(Off_By_One漏洞)
6. Delete
7. View
8. Exit
Off_By_One:Off_By_One
是指我们能够多写入一个字节, 这种漏洞往往和对边界的长度验证不严格和字符串操作有关.
小栗子:
编译
gcc -g example.c -o example
运行
结论: 可以修改chunk size
大小.
漏洞点: Update
功能可以允许我们多输入一个字节.
我们需要解决如下问题
第一个问题
知识点: 当只有一个 small/large chunk 被释放时,small/large chunk 的 fd 和 bk 指向 main_arena 中的地址.
答: Overlap
相关内存
整体思路: 分配三个,0,1,2
.通过Off_By_One
可以将1
的chunk size
改为0xa1
, free(1)
等于将1和2
一起释放, 但2
标识着未释放.alloc(0x48)
将0x7f46a1c7cb78
移到2
中, 打印即可泄露地址.
第二个问题
fastbin attack, 在ralloc_hook写入execve("/bin/sh")来获取shell
通过上一个问题的回答, 我们有可能申请两个,这两个的content
指向同一块内容.
结论: 由于fastbin
是单链表链接的, 所以2的fd(下一个)
指向了1, 我们可以任意修改这个地址, 来达到任意写的目的.
由于我们题目限制最大申请内存为88, 不能直接修改calloc__hook
, 于是我们借助修改top chunk
, 将top chunk 修改至calloc_hook
附近, 然后再将execve("/bin/sh")
地址填入calloc_hook.
修改:
完整EXP
可能在尝试的过程中, EXP会出现失败的情况, 我建议多试几次
0CTF Babyheap 2018
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课