【问题标题】:monitoring a child process from the parent process从父进程监控子进程
【发布时间】:2023-03-24 19:31:01
【问题描述】:

我正在尝试使用 AFL (Qemu-mode) 一个不断等待数据的二进制应用程序进行模糊测试,因为我没有源代码来修改二进制文件以便exit(0) 在解析数据后,我在 AFL (timeout) 中遇到问题,所以我决定在二进制文件周围编写一个包装器,以便我考虑到这一点,可以让它在经过一段时间后退出。

  1. AFL fuzzer:它可以通过测试输入 STDINargument file
  2. 我正在模糊测试的二进制应用程序希望输入在 STDIN 中,然后继续等待输入

我的策略基于父/子样式(分叉),这样子将成为二进制应用程序,而父将监视它。

  • 如果满足以下条件,则父级使子级(二进制应用程序)以 0 状态退出 5 秒内没有任何反应(子进程中没有发生崩溃)。
  • 还有父母负责将输入发送给从stdin接收的孩子

  • 如果孩子崩溃,我希望父母也崩溃,这样AFL 会注意到并保存负责 崩溃

我的问题是:

  • 如何让父级子级退出状态为0
  • 如何将数据发送进程从父进程 在孩子运行二进制应用程序后使用 exec()?
  • 根据出口判断孩子是否崩溃是个好主意吗 孩子的状况

【问题讨论】:

  • "如何让子进程退出父进程的状态为 0"。只有当孩子在某些条件下被编码为退出 0 并且您可以触发其中一个条件时,您才能执行此操作。
  • “如何将数据从父进程发送到子进程”。这个是可行的。并且在 Stackoverflow 和一般网络上的许多帖子中都有介绍。例如:stackoverflow.com/questions/9405985/…
  • @kaylum 我不是二进制应用程序的原始编码器,所以我不知道什么条件触发了 exit(0) 并且二进制文件是静态链接的,没有符号,所以即使反转也很难使用基于签名的工具,如 IDA PRO(什么都不识别)
  • 那么你不能做你想做的事。这就是我的观点。
  • 但我真的不认为你需要这样做。如果孩子没有崩溃,只需让父母杀死孩子并以 0 退出。如果它已经崩溃,则以孩子的非零退出状态退出,可以通过wait获得。

标签: c linux operating-system libc fuzzing


【解决方案1】:

不完全是您所问问题的答案,但是...

因为我没有修改二进制文件的源代码,以便在解析数据后退出(0),

上面的前提是

我决定为二进制文件编写一个包装器,以便在经过一定时间后让它退出,

这种方法虽然可行,但会浪费大量时间:您不知道解析需要多长时间,因此您必须等待一段最长的时间。如果您等待的时间不够长,就会错过测试覆盖率。而且你也错过了解析器进入无限循环的报道。


那么如何在解析后生成程序exit(0)?通过二进制补丁。这是example

您需要在二进制文件中找到ParseInput()(或其他任何名称)例程返回的位置,并修补一些指令以执行syscall(SYS_exit, 0) 的等效项。

之后,您的 fuzzing 会更快(解析完成后不会浪费时间等待),并且您将能够检测到解析器何时进入无限循环。

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 2013-07-29
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多