前言:挺有意思的,打外国的比赛总是能学到一些奇奇怪怪有趣的知识,题中给了一个core的文件,也可以叫做保留进程当前状态的快照文件,通过观察这一瞬时的调试信息,推理程序代码,寻找有用信息进行攻击,也给以后出题提供了新的思路,有点像盲打,但也因此我觉得过于复杂的题就不适合这种出法了,毕竟调试是pwn的命根子了。
简述:Linux core dump(核心转储)是指当一个程序异常终止时(比如由于段错误、非法指令等),操作系统会将该程序的内存内容(包括程序的代码段、数据段、堆栈等信息)以及进程的当前状态(如寄存器的值等)保存到一个文件中。这个文件通常被称为core文件。
文章推荐:Linux core dump 详解可以看这个http://blog.chinaunix.net/uid-21411227-id-1826911.html
做题思路
Swampctf:https://ctf.swampctf.com/challenges
题名:Greeting as a Service
描述:A friend of mine set up a greeting as a service server. He gave me a core dump of it to play around with but won’t give me source. Find anything useful?
题目给了一个core文件
- 我们放入到idea中,会发现没有符号表的,以至于连主函数都是很难找到的
- 这里是主函数,即使你找到主函数的话也无法直接看懂程序,它只是保存这个瞬间的进程的状态文件
- 利用gdb -c ./文件进行查看调试信息,但是我们无法往后调试,这时候就要大胆的去猜测,我们停留在的这个位置是main函数了,因为我觉得出题人要是不给我们放在main函数,也是够歹毒的了,然后根据远程的回显去判断函数的功能,当然也可以先借助ai分析一下
- 查看main函数的汇编,根据远程回显,进行大致功能的分析
- 远程回显
- 分析:两次打印,一次无限制读入
- 打印函数,盲猜puts,因为没对rsi操作
- 但是你查看打印内容的时候是没东西的,这个片段是无效的
- 其实真实的字符串存在于 0x402004+0x1000 0x402017+0x1000的位置存储的
- 原因:数据段的静态地址(
0x402000
)和动态加载地址(0x403000
)不一致
- 读入函数,盲猜gets,因为没对rsi操作
- 基本功能已经猜测完毕了,那就实操试试吧,很显然程序应该是存在栈溢出的,但我们没法本地调试,我们需要直接对远程进行攻击,先溢出回main函数验证猜想
1 | from tools import * |
- 又重新进行了main函数那么说明了我们猜想的正确,那接下来就进行的rop攻击就行
- 最终的exp
1 | from tools import * |
创造cord文件
- 如果想要自己尝试的话,或者有想要出题的话,可以自己尝试创建,很简单的
1 | cat /proc/sys/kernel/yama/ptrace_scope |
返回值:
0
:允许任何进程调试同用户进程(默认禁用)。1
:仅允许调试子进程(常见默认值)。2
:仅允许 root 调试。3
:完全禁止
2.给ptrace权限
- 临时运行(推荐)
1 | echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope |
- 如需永久生效
1 | gedit /etc/sysctl.d/10-ptrace.conf(或 gedit /etc/sysctl.conf) |
- 设置cord文件生成的路径
1 | 查看 |
3.生成cord文件
运行文件,保持运行
找到运行的文件的pid
1 | ps -aux | grep '文件名' |
生成cord文件
第一种(推荐):
在gdb中找到合适的位置进行生成
1 | generate-core-file /tmp/core.12587 |
生成的cord文件调试,跟我们控制的位置一样
第二种:
1 | sudo gcore pid |
这样你就生成了一个core文件,但这个不太推荐,因为这个进程信息并不是我们控制好的,我们也不知道在哪,还是比较推荐在gdb中调试到自己想要展现的位置然后生成
调试cord文件
- 本文作者: NEWYM
- 本文链接: http://example.com/2025/03/31/Linux core dump pwn题/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!