EDB - Как мне отладить программу с перенаправлением ввода / вывода в качестве аргументов?

У меня есть программа x86 asm, которая преобразует строчные буквы в прописные. Я нашел его в сборке PDF и играю с ним, чтобы узнать. Программа может быть вызвана так

./uppercaser> in.txt

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

edb --run ./uppercaser > in.txt

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

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

Спасибо за прочтение.

1 ответ

Edb не делает это легко. К сожалению, это может быть даже невозможно (кроме изменения edb. Это открытый исходный код).

Если вы можете приостановить свою программу до того, как она что-то сделает, вы можете подключиться к уже запущенному процессу вместо запуска xterm.

Эдб принимает аргумент --run и запускает его, перенаправленный на tty xterm, который также запускается edb.

Я попробовал несколько вещей, в том числе

edb --run ./a.out '<in.txt'

Это просто запускает команду с <in.txt в его командной строке. Stdin отлаженной программы исходит от xterm. Edb, очевидно, не задействует оболочку, поэтому вы не можете использовать метасимволы оболочки.

Вывод командной строки edb (в терминале, с которого вы его запускаете, а не в xterm, который он открывает) включает в себя:

Running Terminal:  "/usr/bin/xterm"
Terminal Args:  ("-title", "edb output", "-hold", "-e", "sh", "-c", "tty > /tmp/edb_temp_file_138942160_7753;trap "" INT QUIT TSTP;exec<&-; exec>&-;while :; do sleep 3600; done")

/tmp/edb_... файл не держится Я полагаю, edb просто читает его, чтобы узнать путь к tty xterm, и перенаправляет на него команды stdin/out.

Я не тестировал ввод + вывод, но если вам нужно использовать входной файл, вы можете создать какую-то "оболочку" Python как однострочную. У меня работает и, возможно, некрасиво, но в моих намерениях нормально:

python -c 'from time import sleep;sleep(20);a=open("input","r";content=a.read();print(content);a.close;'|./myapp

Теперь у вас есть 20 секунд, чтобы запустить и прикрепить edb. Вы можете изменить таймер сна по своему усмотрению. В другом терминале вы, возможно, захотите запустить что-то вроде

edb --attach $(pidof myapp)

Способ 1

В EDB есть кнопка запуска, вам нужно щелкнуть ее дважды, и откроется терминал ввода-вывода. Также окно, в котором вы запустили edb, покажет вам местоположение потока TTY. введите описание изображения здесь]1

Способ 2

Если вы хотите перенаправить ввод-вывод вашего двоичного "верхнего регистра" на сетевой порт, вы можете использовать инструмент netcat (nc), чтобы сделать что-то вроде

  1. Запустите "nc -nlvp 90 -e uppercaser"
  2. Откройте отладчик edb, запустив "edb"
  3. В графическом интерфейсе выберите File -> Attach.
  4. Выберите процесс "NC"
  5. Теперь к части ввода-вывода запустите "nc 127.0.0.1 90"
  6. Теперь у вас открыт терминал!

Вы можете заменить 90 любым другим свободным портом в вашей системе.

Оба метода мне понравились. Если вы проводите какое-либо пентестирование, я предлагаю вам использовать второй метод.

Другие вопросы по тегам