converta uma string hex para binário e envie com netcat

32

Eu tenho um arquivo binário que posso enviar com netcat :

$ nc -l localhost 8181 < my.dat

O arquivo contém isso:

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

O que eu realmente quero fazer é enviar a string hexadecimal diretamente. Eu tentei isso:

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

No entanto, o comando acima apenas envia a string ascii diretamente para nc .

    
por Chris Snow 11.07.2013 / 00:00

4 respostas

43

Eu usei a opção -r e -p para xxd :

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

Graças à inspiração da resposta @Gilles, aqui está uma versão em perl:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
    
por 11.07.2013 / 00:05
22

Aqui, uma solução sem xxd ou perl :

Se o echo de seu shell for compatível ( bash e zsh do, mas não dash ), você só precisa usar os escapes de barra invertida direita:

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

Se você tem /bin/echo de GNU coreutils (quase padrão em sistemas Linux) ou de busybox você pode usar também.

Com sed , você pode gerar um padrão de escape:

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

Combinado:

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

Se você tem xxd , é fácil: pode converter de e para hexadecimal.

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

Eu não acho que haja uma maneira razoável (e razoavelmente rápida) de converter hexadecimal em binário usando apenas ferramentas POSIX. Isso pode ser feito com facilidade em Perl. O script a seguir converte hexadecimal em binário, ignorando qualquer caractere de entrada que não seja um dígito hexadecimal. Ele reclama se uma linha de entrada contiver um número ímpar de dígitos hexadecimais.

#!/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 você realmente precisa se ater ao POSIX (por exemplo, em um dispositivo incorporado), recomendo usar Base64 em vez de hexadecimal . Você pode usar o uudecode para decodificar o Base64. A entrada deve ter o formato de cabeçalho e a linha final produzidos por uuencode , não pode ser raw Base64.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
    
por 12.07.2013 / 00:52
1

Semelhante a isto: link

Eu escrevi uma ferramenta que executa várias transformações de stdin e cospe o resultado para stdout. cryptocli dd só fará essas transformações e nada mais.

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

Trabalhará para você.

A ferramenta é de código aberto, você pode encontrá-la aqui: link

Editar:

Você também pode codificar diretamente para hexadecimal usando minha ferramenta:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
    
por 12.11.2017 / 20:55