7

В моем обычном гном-терминале я делаю

netcat -u somewhere 1234

начать отправку пакетов UDP куда-нибудь. Мне нужно передать следующие 5 байтов, записанных в шестнадцатеричном формате: "01 00 af 0f e1". Теперь, как мне ввести escape-последовательность в моем терминале, которая заставляет его отправлять эти 5 байтов на стандартный ввод netcat?

Обновление: просто чтобы уточнить. Я знаю несколько способов ввода байтов в программу. Дело не в этом. Вопрос заключается в том, какую последовательность нажатий клавиш я набираю в своем терминале после запуска программы, чтобы ввести шестнадцатеричный символ, который иначе не отображается на моей клавиатуре. (Например, 0x00, 0x01 или 0x0f.)

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

4 ответа4

8

Вы можете использовать echo -e , (это то, что я имел в виду richardhoskins.) Как это:

/bin/echo -n -e "\x01\x00\xaf\x0f\xe1" | netcat -u somewhere 1234
# -n: no newline at end, -e: interpret escapes

Если ваша реализация echo старая (или просто не инкрустирована GNU), то старой школой будет использование восьмеричного:

/bin/echo -n -e "\001\000\257\017\341" | netcat -u somewhere 1234

Да, восьмеричное - это путь, путь старой школы. Посмотри на ibase и obase в мужчине для bc Проверьте, правильно ли echo работает с od ("восьмеричный дамп"), "od -tx1" для шестнадцатеричного значения, "od -to1" для восьмеричного.

3

Простой подход, хотя и не совсем то, что вы ищете ...

Используйте шестнадцатеричный редактор, чтобы создать файл с байтами, которые вы хотите отправить (вы упоминаете gnome, так что у вас, возможно, уже есть ghex, но любой шестнадцатеричный редактор должен подойти). Для коротких шестнадцатеричных последовательностей я обычно включаю шестнадцатеричный как часть имени (например, test0x0100af0fe1).

Затем просто перенаправьте содержимое в netcat , например:

mas@voco:~$ nc -o testout 127.0.1.1 80 < test0x0100af0fe1
^C
mas@voco:~$ cat testout
> 00000000 01 00 af 0e 10                                  # .....
mas@voco:~$ 

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

1

Вы должны использовать Perl в примере терминала:

./program perl -e' print "\x41\x60\x34\x45"'

он отправит этот шестнадцатеричный адрес в программу. Он часто используется при переполнении буфера в качестве ввода шестнадцатеричного адреса. Страница не показывает все, что я набрал. Посмотрите на Google для переполнения буфера. Эти страницы показывают вам все. Здесь пропущены одинарные кавычки перед первым и вторым в конце целого ввода.

0

Добавьте \x к началу байта. например, "\x01 \x00 \xaf \x0f \xe1".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .