мониторинг дочернего процесса из родительского процесса

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

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

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

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

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

мои вопросы:

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

person zerocool    schedule 27.03.2020    source источник
comment
как вы можете сделать дочерний выход со статусом 0 от родителя. Вы можете сделать это только в том случае, если дочерний элемент запрограммирован на выход из 0 при каком-то условии, и вы можете вызвать одно из этих условий.   -  person kaylum    schedule 27.03.2020
comment
как отправить данные дочернему процессу из родительского процесса. Это выполнимо. И освещается во многих сообщениях на Stackoverflow и в Интернете в целом. Например: stackoverflow.com/questions/9405985/   -  person kaylum    schedule 27.03.2020
comment
@kaylum Я не являюсь первоначальным кодировщиком двоичного приложения, поэтому я понятия не имею, какое условие запускает выход (0), а двоичный файл статически связан без символов, поэтому реверсировать сложно даже с помощью таких инструментов, основанных на подписях, как IDA PRO ( ничего не понял)   -  person zerocool    schedule 27.03.2020
comment
Ну тогда ты не можешь делать то, что хочешь. Это было моей точкой зрения.   -  person kaylum    schedule 27.03.2020
comment
Но я действительно не вижу, что вам нужно это делать. Просто попросите родителя убить ребенка и выйти с 0, если ребенок не разбился. Если произошел сбой, выйдите с ненулевым статусом выхода дочернего процесса, который можно получить с помощью wait.   -  person kaylum    schedule 27.03.2020


Ответы (1)


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

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

Предпосылка выше ложна.

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

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


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

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

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

person Employed Russian    schedule 27.03.2020