fork和proc文件
fork和proc文件
本来这一篇是打算放到持续更新的刷题记录里面的,但是感觉里面的知识点挺有学习得必要,所以还是单独再开了一篇博客
题目
下面的就是程序代码

很简单的一个题目,开了沙箱
1 | |
本来可以用orw直接做的,但是看到一个脚本可以直接获取shell,大为震惊,打算学习一下。
1 | |
关于fork
我对fork其实不算陌生,当时在学习绕过canary接触过fork,但是也仅限于知道fork会复制主进程的所有内容。所以在开始研究这道题目的时候,我对fork产生了一点小小的疑问,比如:我以为fork产生的是线程,因为我线程中的内容是共享的(我的错误认知)
fork是 UNIX/POSIX 系统提供的系统调用,用于创建一个子进程。调用它之后我们会拥有两个进程:
一个是原来的——父进程;另一个是复制品——子进程。
这两个进程会从 fork() 的那一行之后继续执行同一段代码,但它们的“返回值”不同:
- 在父进程中,
fork()返回子进程的 PID。 - 在子进程中,
fork()返回 0。 - 如果分裂失败,它只会在父进程中返回 -1,表示失败,没有子进程产生。
两个进程都有各自的地址空间,但初始时是“写时复制”。也就是说,在真正写之前,它们共享同一份物理内存。如果某个进程试图修改某个内存页,系统才会复制该页给它。
proc文件
之前做题的时候从来没有使用过pid,所以这道题目当时就算输出了pid我都没有考虑
在我们的linux根目录的文件里面,有一个/proc文件夹

进入到这个文件家里面,我们可以看到一些文件和一些数字

这些数字就是pid
我们可以通过访问这些数字文件夹里面的各个文件,获取一个程序运行中的各个程序


我询问过ai,为什么会存在这个proc文件夹,ai给我的解释是,作为调试的接口(我觉得很有道理,于是我接受了这个说法)
这些文件里面保存了一个程序运行的所有信息,包括什么地址所存储的内容,而且只要是相同uid的程序可以对此进行修改
题目思路
到此为止,这道题目的获取shell的脚本思路就很容易明白了——进程注入。
题目给了我们子进程的pid,又有可以任意代码执行的地方,我们就可以打开/porc/(pid)/men这个文件,在这个程序里面选择一个接下来会执行到的地址进行覆盖;而且sandbox只存在于主进程中,子进程没有sandbox,那么我们就可以在子进程中写入shellcraft.sh()获取shell权限
虽然这道题目很简单,给的信息也很多,但是感觉得很了解linux的性质才能想到这种做法,比如我,了解的不深入,就完全不知道还能够有这样的方式去做,最多就只能想到orw了。