przekonwertować ciąg szesnastkowy na binarny i wysłać za pomocą netcat


46

Mam plik binarny, który mogę wysłać netcat:

$ nc -l localhost 8181 < my.dat

Plik zawiera to:

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

Naprawdę chcę bezpośrednio wysłać ciąg szesnastkowy. Próbowałem tego:

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

Jednak powyższe polecenie po prostu wysyła ciąg ascii bezpośrednio do nc.

Odpowiedzi:


55

Użyłem przełączników -r i -p do xxd :

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

Dzięki inspiracji odpowiedzią @Gilles, oto wersja perla:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181

Działa świetnie w przypadku formatu szesnastkowego bajtu Postgres po usunięciu wiodącego \ x.
nathancahill

Dzięki! Działa świetnie również do sprawdzania manifestów słowników Firefox w manifestie! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

Oto rozwiązanie bez xxdlub perl:

Jeśli echowbudowana powłoka obsługuje tę funkcję ( bashi zshrobi to, ale nie robi tego dash), wystarczy użyć właściwego znaku ukośnika odwrotnego:

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

Jeśli masz /bin/echoz GNU coreutils (prawie standardowy w systemach Linux) lub z busybox, możesz go również użyć.

Dzięki sedmożesz wygenerować wzór zmiany znaczenia:

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

Łączny:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181

bardzo fajne rozwiązanie!
Chris Snow

2
Wymiana echoz printfUsuwa zgadywanie jeśli ECHO wspiera rozszerzone funkcje, czy nie. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko,

12

Jeśli tak xxd, to proste: można przekonwertować na format szesnastkowy iz powrotem.

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

Nie sądzę, aby istniał rozsądny (i dość szybki) sposób konwersji szesnastkowej na binarną przy użyciu tylko narzędzi POSIX. W Perlu można to zrobić dość łatwo. Poniższy skrypt konwertuje wartość szesnastkową na binarną, ignorując każdy znak wejściowy, który nie jest cyfrą szesnastkową. Narzeka, jeśli wiersz wejściowy zawiera nieparzystą liczbę cyfr szesnastkowych.

#!/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"; }

Jeśli naprawdę chcesz trzymać się POSIX (np. Na urządzeniu osadzonym), zalecam użycie Base64 zamiast szesnastkowego. Możesz użyć kodu uudecode do zdekodowania Base64. Dane wejściowe muszą mieć format nagłówka i linię końcową wygenerowane przez uuencode , nie może być surowym kodem Base64.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF

1

Podobne do tego: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Napisałem narzędzie, które wykonuje różne transformacje ze standardowego wejścia i wyrzuca wynik na standardowe wyjście. cryptocli ddzrobi tylko te transformacje i nic więcej.

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

Będzie działać dla ciebie.

Narzędzie jest open source, można je znaleźć tutaj: https://github.com/tehmoon/cryptocli

Edytować:

Możesz również zakodować bezpośrednio do heksadecymalnego za pomocą mojego narzędzia:

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

(1) Co 616263ma wspólnego z tym pytaniem? Proszę użyć danych z pytania. (2) Czy możesz wyjaśnić, jak to działa? Nie odpowiadaj w komentarzach, edytuj swoją odpowiedź, aby była jaśniejsza i bardziej kompletna.
G-Man mówi „Przywróć Monikę”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.