论坛首页 CTF竞赛交流区 阅读主题

[原创]KCTF 2025 第8题 暗云涌动wp

257 浏览 0 回复
#1 楼主 2026-06-01 21:08:55
可以看到程序先初始化了io, 随后分配了一些内存: 然后调用了read(0, (void *)qword_5050->input_0_1000, 0x1000uLL);, 之后分析sub_2B97为: 整体实现了一个vm; 在分析vm指令函数时就能看到其中的重点逻辑为0x14与0x15指令所对应的函数: 只有指定寄存器值的最高位为1时才将其作为指针进行读写;
其它运算指令函数有对最高位为1的指针进行验证与清零, 但是针对双寄存器运算的函数存在漏洞, 如果运算前各寄存器的值最高位都不为1则不做验证, 于是可以构造进行任意地址读写;
之后考虑如何获取程序与libc的基址
其中验证函数verity_addr_128B的逻辑验证输入在0x200000与stack_800范围内, 否则清零为0x200000: 于是可以爆破该函数获取stack_800的地址; 之后可以通过stack_800的地址找到qword_5050的地址, 再可以找到被mmap分配的qword_5050->input_0_1000的地址;
因为被mmap分配所以和同为mmap分配的链接库基址挨的很近, 观察/proc/pid/maps可以发现为固定偏移: 顺着input_0_1000的地址可以找到ld-linux-x86-64.so.2的数据段地址, 于是可以找到_rtld_global的地址再取得程序与libc的基址.
有地址范围有任意读写, 接下来看如何getshell;
搜索找到了一篇libc2.35的利用文章 https://bbs.kanxue.com/thread-273895.htm 对照调试, 并根据调试错误稍作修改最终写出完整exp: struct_qword_5050 *sub_2E74()

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288310.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号