web-dev-qa-db-fra.com

convertir une chaîne hexadécimale en binaire et envoyer avec netcat

J'ai un fichier binaire que je peux envoyer avec netcat:

$ nc -l localhost 8181 < my.dat

Le fichier contient ceci:

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

Ce que je veux vraiment, c'est envoyer directement la chaîne hexadécimale. J'ai essayé ça:

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

Cependant, la commande ci-dessus envoie simplement la chaîne ascii directement à nc.

51
Chris Snow

J'ai utilisé les commutateurs - r et - p sur xxd:

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

Grâce à l'inspiration de la réponse @Gilles, voici une version Perl:

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

Voici une solution sans xxd ou Perl:

Si le echo intégré à votre Shell le prend en charge (bash et zsh le font, mais pas dash ), vous avez juste besoin pour utiliser la bonne barre oblique inverse:

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

Si tu as /bin/echo de GNU coreutils (presque standard sur les systèmes Linux) ou de busybox, vous pouvez également l'utiliser.

Avec sed vous pouvez générer un modèle échappé:

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

Combiné:

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

Si vous avez xxd, c'est simple: il peut se convertir vers et depuis hexadécimal.

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

Je ne pense pas qu'il existe un moyen raisonnable (et raisonnablement rapide) de convertir l'hexadécimal en binaire en utilisant uniquement des outils POSIX. Cela peut être fait assez facilement en Perl. Le script suivant convertit l'hexadécimal en binaire, ignorant tout caractère d'entrée qui n'est pas un chiffre hexadécimal. Il se plaint si une ligne d'entrée contient un nombre impair de chiffres hexadécimaux.

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

Si vous devez vraiment vous en tenir à POSIX (par exemple sur un périphérique intégré), je vous recommande d'utiliser Base64 au lieu de hexadécimal. Vous pouvez utiliser decode pour décoder Base64. L'entrée doit avoir le format d'en-tête et la ligne de fin produits par encode , il ne peut pas s'agir de Base64 brut.

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

Similaire à ceci: https://stackoverflow.com/questions/1604765/linux-Shell-scripting-hex-string-to-bytes/47253233#472532

J'ai écrit un outil qui effectue diverses transformations de stdin et crache le résultat en stdout. cryptocli dd ne fera que ces transformations et rien d'autre.

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

Fonctionnera pour vous.

L'outil est open source, vous pouvez le trouver ici: https://github.com/tehmoon/cryptocli

Éditer:

Vous pouvez également encoder directement en hexadécimal en utilisant mon outil:

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