avatar

GUESS-fork相关

fork相关

GUESS-WP

​ 写GUESS这题的时候完全没有注意到调用了fork,因为最开始自己运行的时候让我猜了三次,于是就扔进ida直接看到gets()就开始准备利用漏洞了,学长提醒我我才注意到那题并不是那么单纯。

fork函数

​ fork函数这个函数很有意思,它是在程序调用它之后,由系统给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,进程的运行也是从父进程调用fork函数的地方开始,两个进程的区别是fork返回的值不同。

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值。

GUESS

​ 例如GUESS那题中,程序就是利用返回值来实现与用户的交互

​ 这里实质上是父进程循环了三次后return,而每次fork出的子进程由于返回值是零,通过if函数后执行break跳出循环,给予用户输入的机会,然后子进程就结束了。

​ 所以一共会fork出三个子进程,这也就是我执行程序时,拥有三次输入机会的由来。

父子进程的调试

​ 在gdb中可以通过设置达到多进程调试的效果。

​ 我这次是分开进行调试的,一起调试的方法等遇到了再写。

1、 follow-fork-mode

​ 用法:set follow-fork-mode [parent|child]

​ 进入gdb后,直接设置,默认是child

​ 用处是当fork出子进程后,确定当前调试的进程,parent为父进程,child为子进程

​ 可用使用show follow-fork-mode 来查询当前fork模式

2、detach-on-fork mode

​ 用法:set detach-on-fork [on|off]

​ on: 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式,另一个进程会继续执行。

​ off: 父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。

​ 也可以通过show detach-on-fork mode 来查询当前模式

​ eg:如果设置了set detach-on-fork off且follow-fork-mode为parent,fork后子进程并不运行,而是处于暂停状态。

3、进程的切换

​ 在gdb中使用info inferiors来查看进程信息,得到的信息可以看到最前面有一个进程编号,使用 inferior [num] 来进行进程切换。

​ ps:我在进行调试的时候,发现fork出一个新的子进程后,父进程的pid会出现变化,在终端对pid进行查询和分析后,认为是gdb调试的并不是程序的主进程,理由是虽然子进程1的父进程变成了2033进程,但是gdb调试的编号1的父进程,虽然pid有变化,但是父进程并没有变。

​ 由于本人学识尚浅,只能作出推测,如果师傅发现我这里有错误或是能为我解惑,还请与我联系交流。

文章作者: 0bs3rver
文章链接: http://yoursite.com/2020/04/18/GUESS-fork%E7%9B%B8%E5%85%B3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋