Как найти скрытые или недокументированные параметры / флаги в двоичном исполняемом файле? - PullRequest
0 голосов
/ 26 июня 2018

Многие программы CLI имеют документированный синтаксис для флагов и опций, обычно доступных на странице руководства или с использованием флага -h или --help. Но часто есть очень полезные, очень мощные опции, которые преднамеренно недокументированы , но я нахожу это очень трудным и трудоемким поиском.

Обратите внимание, что для моих начальных целей я специально ищу способы сделать это на Darwin (i / mac [h] [] OS [X], или как там это называется в наши дни ...), и я приму ответ, специфичный для этой платформы. Но по-настоящему идеальным будет то, что будет работать на разных платформах и архитектурах.

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

Я знаю, что существует примерно 10 миллиардов функций, библиотек и методов для разбора опций примерно для того же количества языков и платформ; getopt и getopt_long приходят на ум вместе со многими другими, обычно называемыми чем-то, включающим комбинацию одного или нескольких терминов opt[s] или arg[s] и get или parse. Итак, еще раз, чтобы ограничить объем моего вопроса здесь, сегодня я специально ищу скрытые опции для утилит, найденных в продуктах Apple, поэтому, если это поможет (ограничить объем приемлемых ответов) для моих целей, давайте предположим, что цель программа (ы):

  • Были написаны в языковом семействе [Objective-] C [++] (хотя бонусные баллы и для Swift тоже!).
  • Возможно, они имеют кодовое обозначение и могут быть удалены, а могут и не удаляться отладочной информации.
  • не намеренно запутано.
  • У нас есть по крайней мере r-x доступ к программе, поэтому мы можем сделать копию, которую можно изменить.
  • Следовательно, мы можем сами снимать или снимать подписи и так далее; однако мы не сможем выполнить эти измененные версии двоичных файлов из-за ограничений кодовой подписи. Это мягкое требование, поскольку мы можем отключить требования подписи, но в идеале это не так.
  • Аналогичным образом, по той же причине, по которой мы не сможем выполнить произвольный код / ​​неподписанные приложения из других источников, лучшие ответы, которые я ищу, не требуют большого количества дополнительного программного обеспечения. Как минимум, пожалуйста, не говорите мне просто купить копию IDA Pro.
  • Мы можем, но , вероятно, не , иметь доступ к исходному коду (duh).

Мой текущий процесс для этого обычно включает:

  • Копирование исполняемого файла.
  • Удаление посторонних вещей, таких как кодовые подписи, и я обычно strip это тоже.
  • Создание контекста в известной опции, поиск вручную и отбор возможных кандидатов.

То есть я нашел несколько полезных опций, таких как xip -x и pkgutil --expand-full , например:

cp -H $(⁅which¦xcrun -f⁆ ⁅xip¦pkgutil⁆) /tmp/⁅xip¦pkgutil⁆
codesign --remove-signature /tmp/⁅xip¦pkgutil⁆
strip /tmp/⁅xip¦pkgutil⁆
strings ⁅-a -⁆ /tmp/⁅xip¦pkgutil⁆ | grep -C10 ⁅sign¦expand⁆

(причудливый Unicode, очевидно, указывает на различия).

Но до сих пор я обнаружил, что есть небольшая рифма или причина, где именно они найдены; все это методом проб и ошибок после этого. Кроме того, это значительно сложнее с вещами, основанными на C ++ (например, инструментами на основе LLVM, некоторые из которых имеют опцию -print-all-options, а некоторые нет).

Я бы очень хотел найти способ сделать полный список всех опций для всех системных утилит Apple и т. Д. Или, по крайней мере, что-то близкое к этому. Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...