sekaictf-2025-pwn
sekaictf–pwn复现
前言
备战下一场xctf分站赛
speedpwn-2
这是一道tcache 利用的题目,赛后复盘是有源码的,但我们这里还是从写题的角度进行一个分析
ida分析

main 函数 首先申请了0x190大小的堆块作为一块画布, 然后循环进行操作. 每次循环的开始会调用print_canvas 把画布的内容打印出来,然后用户可以输入p,r,h 进行对应的操作
- p , 修改堆块的一个字节
- r , 重新申请堆块
- h , 打印操作的说明
图1 就是 r , 对应的操作

图2 这里是p , 对应的操作.
在75 行这里,就是一个明显的溢出漏洞. 因为这里没有对范围的检测 , 所以我们可以输入非法值 , 去修改不在这个堆块范围内的堆空间的值 .
思路分析
题目环境是 2.34的libc
- 首先是泄露libc . 题目没有开启
ALSR和FULL RELRO, 可以从ida里获取函数plt的地址 , 同时可以修改got表 . 首先 , 利用 溢出漏洞 , 修改tcache_perthread_struct的counts和entries, 把.got表 附近的某一段 放入tcache bins中 , 再利用r把这个块空间分配出来. - 然后是 , 修改
got表. 利用上面的溢出漏洞 , 把free修改为printf, 利用格式化字符串 , 泄露出libc. - 重复 1 的步骤 , 把这个堆块 重新申请回来. 因为当时
free被修改为了printf, 所以不能直接申请 , 得重复1 的步骤. - 这一次把free修改为system , 然后把堆块内容设置为
/bin/sh\x00
exp
1 | from esy import * |
learning_oop
ida分析

首先漏洞点 , 很明显是set_name 函数中的溢出漏洞 , 可以往下溢出覆盖下面的堆块. 然后堆块申请都是固定大小0x120
可以看到这是一个c++的程序 , 他的堆块都是 作为对象申请的. 这里应该是 用 Animal 这样一个类 , 然后 Dog,Cat,Horse,Parrot 类继承了Animal,并对其中的某些方法重写了.

在初始化一个动物的时候 , 在fd 的位置 写了一个虚表的地址 ,后续的函数调用都是靠这个地址去寻找和调用函数.
年龄,饥饿值,体力,其实是堆块最后0x10字节保存的数据. 同时 , 意识到 , 可以溢出修改这个部分 , 去控制 动物的 这些信息.

这里 可以通过控制 fd 也就是劫持虚表 , 来完成调用自己想要的函数.
思路分析
题目环境是2.39的libc . (没有版本讲堆题,都是在耍流氓)
- 首先要泄露
libc, 然后劫持虚表 , 这里应该是很容易想到的. 那么如何泄露libc呢? 肯定是通过unsorted bin了. 然后让堆块进入unsorted bin呢? 如果填满一个tcache bins, 再free一个0x120的堆块, 看样子可行,但可以没有uaf漏洞,这样利用会很困难. 所以 , 通过溢出修改堆块 的size造一个0x481 的堆块 , 造一个重叠. 因为这个大小的堆块超过了tcahce bins的大小会直接进入unsorted bin. - 这个时候 再申请一个堆块 ,
arena信息就会写入到下一个堆块的name的位置, 如果此时下一个堆块恰好die,就会触发get_name把信息泄露出来. - 然后劫持
vtable,我们通过在堆上布置一个虚表,在创建成功后,程序会返回堆的地址. 然后只要有合适的gadgets, 就可以调用system. 这里肯定需要的是控制rdi, 同时需要call
exp
1 | from esy import * |
outdated
ida分析
exp
1 | from pwn import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 江畔!
评论



