преобразовать шестнадцатеричную строку в двоичную и отправить с помощью netcat

46

У меня есть двоичный файл, который я могу отправить с netcat:

$ nc -l localhost 8181 < my.dat

Файл содержит это:

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC

То, что я действительно хочу сделать, это отправить шестнадцатеричную строку напрямую. Я пробовал это:

$ echo '0006303030304e43' | nc -l localhost 8181

Однако вышеприведенная команда просто отправляет строку ascii напрямую nc.

Крис Сноу
источник

Ответы:

55

Я использовал ключи -r и -p для xxd :

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Благодаря вдохновению от ответа @Gilles, вот версия Perl:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Крис Сноу
источник
Прекрасно работает с байтовым шестнадцатеричным форматом Postgres, если начальный \ x удален.
Натанкахилл
Благодарность! Отлично работает также для проверки дайджестов словарей Firefox в манифесте! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Авио
26

Здесь решение без xxdили perl:

Если echoвстроенная программа вашей оболочки поддерживает ее ( bashи zshделает, но не делает dash), вам просто нужно использовать правильные экранированные символы обратной косой черты:

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

Если у вас есть /bin/echoот GNU Coreutils (почти стандартных систем Linux) или BusyBox вы можете использовать его, тоже.

С помощью sedвы можете сгенерировать экранированный шаблон:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

Комбинированный:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
jofel
источник
очень хорошее решение!
Крис Сноу
2
Замена echoна printfудаляет работу догадки, если echo поддерживает расширенные функции или нет. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181,
Яакко
12

Если у вас есть xxd, это легко: он может конвертировать в и из шестнадцатеричного.

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Я не думаю, что есть разумный (и достаточно быстрый) способ преобразования шестнадцатеричного числа в двоичное с использованием только инструментов POSIX. Это может быть сделано довольно легко в Perl. Следующий скрипт преобразует шестнадцатеричное в двоичное, игнорируя любой входной символ, который не является шестнадцатеричной цифрой. Он жалуется, если строка ввода содержит нечетное число шестнадцатеричных цифр.

#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
    tr/0-9A-Fa-f//cd;
    if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
    if (length($_) & 1) { s/(.)$//; $c = $1; }
    print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }

Если вам действительно нужно придерживаться POSIX (например, на встроенном устройстве), я рекомендую использовать Base64 вместо шестнадцатеричного. Вы можете использовать uudecode для декодирования Base64. Входные данные должны иметь формат заголовка и конечную строку, создаваемую uuencode , это не может быть необработанный Base64.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Жиль "ТАК - перестань быть злым"
источник
1

Аналогично этому: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

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

echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081

Будет работать на вас.

Инструмент с открытым исходным кодом, вы можете найти его здесь: https://github.com/tehmoon/cryptocli

Редактировать:

Вы также можете закодировать непосредственно в шестнадцатеричный код, используя мой инструмент:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
tehmoon
источник
(1) Какое отношение 616263имеет этот вопрос? Пожалуйста, используйте данные из вопроса. (2) Можете ли вы объяснить, как это работает? Пожалуйста, не отвечайте в комментариях, отредактируйте свой ответ, чтобы сделать его более понятным и полным.
G-Man говорит «Восстановить Монику»