converte una stringa esadecimale in binario e invia con netcat


46

Ho un file binario che posso inviare con netcat:

$ nc -l localhost 8181 < my.dat

Il file contiene questo:

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

Quello che voglio davvero fare è inviare direttamente la stringa esadecimale. Ho provato questo:

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

Tuttavia, il comando precedente invia semplicemente la stringa ASCII direttamente a nc.

Risposte:


55

Ho usato l' opzione -r e -p su xxd :

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

Grazie all'ispirazione della risposta di @Gilles, ecco una versione perl:

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

Funziona alla grande con il formato esadecimale di Postgres una volta che il \ x iniziale viene rimosso.
nathancahill,

Grazie! Funziona alla grande anche per controllare i digest dei dizionari Firefox in manifest! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio,

26

Ecco una soluzione senza xxdo perl:

Se l' echointegrato della shell lo supporta ( bashe lo zshfa, ma non dash), è sufficiente utilizzare le escape backslash corrette:

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

Se hai /bin/echoda GNU coreutils (quasi standard su sistemi Linux) o da busybox, puoi anche usarlo.

Con sedte puoi generare un modello di escape:

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

Combinato:

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

soluzione molto bella!
Chris Snow,

2
La sostituzione echocon printfrimuove il lavoro di ipotesi se l'eco supporta funzionalità estese o meno. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko,

12

Se hai xxd, è facile: può convertire da e verso esadecimali.

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

Non penso che ci sia un modo ragionevole (e ragionevolmente veloce) per convertire esadecimali in binari usando solo strumenti POSIX. Si può fare abbastanza facilmente in Perl. Lo script seguente converte esadecimale in binario, ignorando qualsiasi carattere di input che non sia una cifra esadecimale. Si lamenta se una riga di input contiene un numero dispari di cifre esadecimali.

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

Se hai davvero bisogno di attenersi a POSIX (ad esempio su un dispositivo incorporato), ti consiglio di usare Base64 invece di esadecimale. Puoi usare uudecode per decodificare Base64. L'input deve avere il formato dell'intestazione e la riga finale prodotti da uuencode , non può essere Base64 non elaborato.

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

1

Simile a questo: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Ho scritto uno strumento che esegue varie trasformazioni da stdin e sputa il risultato a stdout. cryptocli ddfarà solo quelle trasformazioni e nient'altro.

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

Funzionerà per te.

Lo strumento è open source, puoi trovarlo qui: https://github.com/tehmoon/cryptocli

Modificare:

Puoi anche codificare direttamente in esadecimale usando il mio strumento:

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

(1) Cosa 616263c'entra con questa domanda? Si prega di utilizzare i dati della domanda. (2) Puoi spiegare come funziona? Non rispondere nei commenti, modificare la risposta per renderla più chiara e completa.
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.