конвертувати шістнадцяткову рядок у двійкову та надіслати 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

Відмінно працює для шістнадцяткового формату bytea Postgres, коли провідний \ x знімається.
nathancahill

Дякую! Також чудово працює для перевірки дайджестів словників 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

дуже приємне рішення!
Кріс Сноу

2
Заміна echoна printfвидаляє роботу здогадується, якщо ехо підтримує розширені функції чи ні. 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

Я написав інструмент, який виконує різні перетворення від stdin і розплющує результат до stdout. cryptocli ddбуде робити лише ті перетворення і більше нічого.

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

Буде працювати для вас.

Інструмент є відкритим кодом, його можна знайти тут: https://github.com/tehmoon/cryptocli

Редагувати:

Ви також можете кодувати безпосередньо в hex за допомогою мого інструменту:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081

(1) Що стосується 616263цього питання? Будь ласка, використовуйте дані з питання. (2) Чи можете ви пояснити, як це працює? Будь ласка, не відповідайте на коментарі, редагуйте свою відповідь, щоб зробити її більш зрозумілою та повною.
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.