мониторинг дочернего процесса из родительского процесса - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь использовать fuzz, используя AFL ( Qemu-mode ) бинарное приложение, которое продолжает ждать данных, а потому что я не У меня есть исходный код, чтобы изменить двоичный файл, чтобы он exit(0) после анализа данных, я столкнулся с проблемой в AFL (timeout), поэтому я решил написать оболочку вокруг двоичного файла, чтобы я мог сделать это выход по прошествии определенного времени, учитывая это.

  1. Фаззер AFL: он может проходить тестовые входы через STDIN или как argument file
  2. двоичное приложение, которое Я размышляю, ожидаю, что вход будет в STDIN и просто буду ждать ввода

Мои стратегии основаны на родительский / дочерний стиль (разветвление) таким, что ребенок будет бинарным приложением, а родитель будет контролировать его.

  • родитель заставляет дочерний элемент (двоичное приложение) выйти со статусом 0, если в течение 5 секунд ничего не происходит (в дочернем процессе не происходит cra * sh).
  • , а также родитель отвечает за отправку входных данных дочернему элементу, которые он получает от stdin

  • , если дочерний элемент cra sh Я хочу, чтобы родительский элемент cra sh а также, что AFL заметит это и сохранит тестовый файл, который отвечает за кр sh

мои вопросы:

  • как вы можете сделать дочерний выход со статусом 0 от родителя ?
  • как отправить данные ребенку process от родительского process после того, как дочерний процесс запускает бинарное приложение, используя exec()?
  • . Это хорошая идея, чтобы сказать, если ребенок разбился на основе на статусе выхода ребенка ?

1 Ответ

1 голос
/ 27 марта 2020

Не совсем ответ на вопрос, который вы задаете, но ...

, потому что у меня нет исходного кода, чтобы изменить двоичный файл, чтобы он выходил (0) после анализа data,

Приведенная выше предпосылка: false .

Я решил написать обертку вокруг двоичного файла, чтобы можно было завершить его после проходит определенное время,

Такой подход, хотя и осуществимый, будет тратить много времени: вы не знаете, сколько времени занимает разбор, поэтому вам придется подождать некоторое максимальное время. Если вы не будете ждать достаточно долго, вы пропустите тестовое покрытие. И вам также не хватает охвата парсера, переходящего в бесконечное число l oop.


Так как же может сделать программу exit(0) после анализа? Путем бинарного исправления. Вот пример .

. Вам нужно будет найти место в двоичном файле, в котором возвращается подпрограмма ParseInput() (или как она там называется), и исправить несколько инструкций для выполнения эквивалент syscall(SYS_exit, 0).

Скорее всего, ваше фаззинг будет go намного быстрее (не тратя времени на ожидание, когда синтаксический анализ уже выполнен), и вы сможете определить, когда анализатор переходит в бесконечное l oop.

...