Отладка программы без исходного кода (Unix / GDB) - PullRequest
2 голосов
/ 11 марта 2012

Это домашнее задание.Только советы, точных ответов нет.

У меня есть скомпилированная программа (без исходного кода), которая принимает аргументы командной строки.Существует правильная последовательность заданного числа аргументов командной строки, которая заставит программу вывести «Success».При неверных аргументах он выведет «Failure».

. Меня смущает одна вещь: в инструкциях упоминаются два системных инструмента (не называет их), которые помогут определить правильные аргументы.Единственный инструмент, с которым я знаком (если я что-то упускаю) - это GDB, поэтому я считаю, что мне не хватает критического компонента этой задачи.

Задача состоит в том, чтобы определить правильные аргументы.До сих пор я запускал программу в GDB и устанавливал точку останова на main, но я действительно не знаю, куда идти дальше.Любые профессиональные советы?

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Вы уверены, что должны его отладить? Было бы проще разобрать его. При разборке ищите cmp

1 голос
/ 11 марта 2012

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

Если вам повезет, программа была скомпилирована и предоставлена ​​вам без запуска strip. В этом случае вам может помочь таблица символов. Тогда вы можете попробовать пошагово пройти программу (см. gdb руководства). Это может быть утомительно, но есть способы установить точку останова и сказать отладчику выполнить некоторый вызов функции (например, любой из стандартных библиотек) и остановиться по возвращении. Делая это несколько раз (определите, где вызывается стандартная или внешняя библиотека, установите точку останова для следующей инструкции после возврата, позвольте gdb запустить процесс через вызов, а затем проверьте, что делает код, кроме этого.

В сочетании с ltrace должно быть довольно легко увидеть последовательность вызовов strcmp() (или аналогичных). Когда вы видите строку, с которой сравнивается ваш ввод, вы можете разорвать весь процесс и повторно вызвать gdb и программу с этим одним аргументом, проследить до следующего и так далее. Или вы можете изучить более продвинутые трюки gdb и изменить вектор аргументов и перезапустить main() с нуля.

На самом деле это звучит забавно, и я мог бы попросить мою жену сделать простой бинарный файл, чтобы я мог это примерить. Также может быть создана небольшая программа для генерации двоичных файлов такого рода. Я подумываю о небольшом #INCLUDE в источниках, который предоставляет «парольную фразу» аргументов, и файл make, который выбирает от трех до пяти слов из / usr / dict / words, генерирует этот файл #INCLUDE из шаблона, затем компилирует двоичный файл, использующий эту последовательность.

1 голос
/ 11 марта 2012
  1. Существуют не только инструменты для декомпиляции двоичных файлов X86 в списки кодов на Ассемблере, но также и те, которые пытаются показать более высокий уровень или удобочитаемый список. Попробуйте поискать в Google и посмотрите, что вы найдете. Я был бы конкретен, но тогда это было бы контрпродуктивно, если бы ваша задача - выучить некоторые навыки обратного инжиниринга.

  2. Возможно, код выглядит примерно так: если Arg (1) = 'FOO', выведите «Success». Таким образом, вам не нужно разбирать вообще. Вместо этого вам, возможно, потребуется найти инструмент, который выводит все строки в исполняемом файле, которые выглядят как последовательности символов ASCII. Если последовательность, которую вы должны ввести, не входит в набор символов, легко вводимых с клавиатуры, существует множество утилит, которые будут делать это. Если программа была разработана очень тщательно, автор не оставил бы «FOO», если бы это был «пароль», но попытался бы его скрыть.

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