半决赛
catchme
checksec
| |
IDA
main
| |
allocate
| |
delete
| |
leak
| |
edit
| |
clear
| |
攻击思路
有明显的 UAF 漏洞
拥有 0x440 / 0x450 / 0x50 大小的 chunk
0x50 大小的走 calloc ,不使用 tcache
glibc 版本为 2.27
所以这题目打的是 house of storm
但是有点小坑, 如果最后回弹 fake chunk 时未填满 0x50 的 tcache 会导致 tcache stashing unlink 触发导致回弹失败,并在又一次的 bins 的处理循环中崩溃,,,
打完 house of storm 后劫持 __free_hook 打 onegadget 即可
刚好这道题可以直接打 onegadget ,如果上下文环境不满足的话,得劫持 __malloc_hook 和 __realloc_hook (两个连着的)去微调栈帧了
house of storm
在一次 malloc 中同时执行一次 unsortedbin attack 和两次 largebin attack 伪造出一个 0x50 大小的 fake chunk (size 为 0x55)
利用条件:
- glibc 版本小于等于 2.28
- 布局两个属于 largesize 的 chunk ,分别放在 unsortedbin 和 largebin 中,前者的 size 要比后者的大,且两个 chunk 要属于同一个 index
具体操作:
- unsortedchunk->bk = target1
- largechunk->bk = target2
- largechunk->bk_nextsize = target3
产生效果:
- unsorted_chunks(av) = target1
- target1->fd = unsorted_chunks(av)
- target2->fd = unsortedchunk
- target3->fd_nextsize = unsortedchunk
由于不进行链表完整性检查,直接伪造:
- unsortedchunk->bk = target
- largechunk->bk = target + 0x8
- largechunk->bk_nextsize = target - 0x18 - 5
产生效果:
- unsorted_chunks(av) = target
- target->fd = unsorted_chunks(av)
- target->bk = unsortedchunk
- target->size = 0x55 / 0x56
target 就是伪造的 chunk ,接下来只要申请一个 0x50 大小的 chunk 就能拿到 target 的写入权限
但是需要多试几次,如果 size 为 0x56 的话会崩掉,必须是 0x55 ,要求 NON_MAIN_ARENA 位为 0
exp
| |
