劫持vtable修改程序执行流——pwnable seethefile
2021/7/23 1:06:55
本文主要是介绍劫持vtable修改程序执行流——pwnable seethefile,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前置知识
vtable
vtable是和file结构体并列的一段内容,是函数指针数组,其中包含了对file的一些操作函数。
以下来自ctf-wiki
在 libc2.23 版本下,32 位的 vtable 偏移为 0x94,64 位偏移为 0xd8
以下是vtable的实际结构,如图所示,我们需要关注的是close部分。也就是关闭文件时将会调用的函数。
## 劫持原理
以下内容摘自https://www.jianshu.com/p/2e00afb01606
分析close函数,最关键的利用点在这里
注意到_IO_FINISH(fp)是vtable中的一个函数,而参数又是我们可以控制的,因此可以通过劫持函数和参数来控制执行流。但是前提是通过前面的if,这里检查的是
fp->_IO_file_flags & _IO_IS_FILEBUF
其中_IO_IS_FILEBUF被定义为0x2000.
因此,只需要在file指针的flag位置放上0xffffdfff即可(或者是别的,只要满足fp->_IO_file_flags & _IO_IS_FILEBUF=0来绕过判断都可以)所以程序接下来会执行_IO_FINISH。
因此,总的来说就是布置fp("/bin/sh"地址),fp->flags(0xffffdfff),vtable->finish(system)这三个参数,来实现最终的getshell。
seethefile
这里可以看到的是,程序可以实现读写除了flag之外的其他文件,参考了别人的wp.知道了原来/proc/self/maps可以输出自己虚拟空间的映射方式,从而获得libc基地址。这里注意要输出两次,第一次输出不完。
在最后有个明显的scanf漏洞,注意到fp指针也在bss段上,因此可以考虑溢出劫持fp。具体的布置方法如下
简单分析下流程:先调用fclose,发现fp->flag & 0x2000不满足上述if条件,就调用finish函数,现在全是system,其中的参数是fp,被我们布置为指向fp->flags的地址,怎么不是/bin/sh啊?因为没办法,第一位必须是flags位,接下来因为分号截断,就成功调用/sh来作为system参数,拿到shell。
这里比较无语的是为了防止奇奇怪怪的拿到flag,还必须用他的seethefile文件夹下的程序打开才能行…自己探索吧!
这篇关于劫持vtable修改程序执行流——pwnable seethefile的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?
- 2025-01-10实现精准执行:团队协作新方法
- 2025-01-10如何使用工具提升活动策划团队的工作效率?几个必备工具推荐
- 2025-01-10WiX 标签使用介绍:打造专业安装程序的利器