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), чтобы сделать что-то вроде
- Запустите "nc -nlvp 90 -e uppercaser"
- Откройте отладчик edb, запустив "edb"
- В графическом интерфейсе выберите File -> Attach.
- Выберите процесс "NC"
- Теперь к части ввода-вывода запустите "nc 127.0.0.1 90"
- Теперь у вас открыт терминал!
Вы можете заменить 90 любым другим свободным портом в вашей системе.
Оба метода мне понравились. Если вы проводите какое-либо пентестирование, я предлагаю вам использовать второй метод.