Konvertieren Sie eine hexadezimale Zeichenfolge in eine binäre Zeichenfolge und senden Sie sie mit Netcat

46

Ich habe eine Binärdatei, mit der ich senden kann netcat:

$ nc -l localhost 8181 < my.dat

Die Datei enthält Folgendes:

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

Was ich wirklich tun möchte, ist die Hex-Zeichenfolge direkt zu senden. Ich habe es versucht:

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

Der obige Befehl sendet jedoch nur die ASCII-Zeichenfolge direkt an nc.

Chris Snow
quelle

Antworten:

55

Ich habe die Schalter -r und -p für xxd verwendet :

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

Dank der Inspiration von @Gilles answer ist hier eine Perl-Version:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Chris Snow
quelle
Funktioniert hervorragend für Postgres 'ByteHex-Format, wenn das führende \ x entfernt ist.
nathancahill
Vielen Dank! Funktioniert auch hervorragend zum Überprüfen von Firefox-Wörterbüchern in Manifesten! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio
26

Hier eine Lösung ohne xxdoder perl:

Wenn das echoBuilt-in Ihrer Shell dies unterstützt ( bashund zshzwar, aber nicht dash), müssen Sie nur die rechten Backslash-Escapes verwenden:

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

Wenn Sie /bin/echovon GNU coreutils (fast Standard auf Linux - Systemen) oder von Busybox können Sie es auch.

Mit können sedSie ein Escape-Muster erzeugen:

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

Kombiniert:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Jofel
quelle
sehr schöne lösung!
Chris Snow
2
Durch Ersetzen echodurch printfwird die Vermutungsarbeit aufgehoben, wenn Echo erweiterte Funktionen unterstützt oder nicht. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko
12

Wenn xxdja, ist das ganz einfach: Es kann hexadezimal konvertiert werden.

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

Ich glaube nicht, dass es eine vernünftige (und relativ schnelle) Möglichkeit gibt, Hexadezimalzahlen nur mit POSIX-Tools in Binärzahlen zu konvertieren. In Perl ist das ziemlich einfach. Das folgende Skript konvertiert hexadezimal in binär und ignoriert jedes Eingabezeichen, das keine hexadezimale Ziffer ist. Es beschwert sich, wenn eine Eingabezeile eine ungerade Anzahl von Hexadezimalziffern enthält.

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

Wenn Sie sich wirklich an POSIX halten müssen (z. B. auf einem eingebetteten Gerät), empfehle ich die Verwendung von Base64 anstelle von hexadezimal. Sie können uudecode verwenden , um Base64 zu dekodieren. Die Eingabe muss das von uuencode erzeugte Header-Format und die Endzeile haben , es darf kein Raw Base64 sein.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Gilles 'SO - hör auf böse zu sein'
quelle
1

Ähnlich dazu: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Ich habe ein Tool geschrieben, das verschiedene Transformationen von stdin durchführt und das Ergebnis in stdout ausspuckt. cryptocli ddwerde nur diese Transformationen machen und sonst nichts.

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

Wird für Sie arbeiten.

Das Tool ist Open Source und hier zu finden: https://github.com/tehmoon/cryptocli

Bearbeiten:

Sie können mit meinem Tool auch direkt in hexadezimal kodieren:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
tehmoon
quelle
(1) Was hat 616263das mit dieser Frage zu tun? Bitte verwenden Sie die Daten aus der Frage. (2) Können Sie erklären, wie das funktioniert? Bitte antworten Sie nicht in Kommentaren, sondern bearbeiten Sie Ihre Antwort, um sie klarer und vollständiger zu gestalten.
G-Man sagt, dass Monica