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

46

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 faire, c'est envoyer la chaîne hexagonale directement. J'ai essayé ceci:

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

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

Chris Snow
la source

Réponses:

55

J'ai utilisé le commutateur -r et -p sur xxd :

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

Grâce à l'inspiration de @Gilles answer, voici une version de Perl:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Chris Snow
la source
Fonctionne très bien pour le format bytea hex de Postgres une fois que le premier \ x est rayé.
nathancahill
Merci! Fonctionne également très bien pour vérifier les dictionnaires de Firefox dans le manifeste! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio
26

Voici une solution sans xxdou perl:

Si le echoshell intégré de votre shell le supporte ( bashet le zshfait, mais pas dash), il vous suffit d'utiliser les échappements de barre oblique inverse de droite:

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

Si vous avez /bin/echode GNU coreutils (presque standard sur les systèmes Linux) ou de busybox vous pouvez l' utiliser aussi.

Avec sedvous pouvez générer un motif é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
jofel
la source
très belle solution!
Chris Snow
2
Remplacer echopar printfsupprime le travail de conjecture si l'écho prend en charge les fonctionnalités étendues ou non. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko
12

Si vous avez xxd, c'est facile: il peut convertir en 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 hexadécimal en binaire en utilisant uniquement les outils POSIX. Cela peut être fait assez facilement en Perl. Le script suivant convertit hexadécimal en binaire, en ignorant tout caractère saisi 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 avez vraiment besoin de 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 uudecode pour décoder Base64. L'entrée doit avoir le format d'en-tête et la ligne de fin produits par uuencode , elle ne peut pas être brute Base64.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Gilles, arrête de faire le mal
la source
1

Semblable à cela: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

J'ai écrit un outil qui effectue diverses transformations à partir de stdin et crache le résultat sur stdout. cryptocli ddne fera que ces transformations et rien d'autre.

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

Travaillera pour vous.

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

Modifier:

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

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
tehmoon
la source
(1) Qu'est-ce que cela 616263a à voir avec cette question? Veuillez utiliser les données de la question. (2) Pouvez-vous expliquer comment cela fonctionne? S'il vous plaît ne répondez pas dans les commentaires, modifiez votre réponse pour la rendre plus claire et plus complète.
G-Man dit 'Réintégrez Monica'