web-dev-qa-db-ja.com

16進文字列をバイナリに変換し、netcatで送信する

netcatで送信できるバイナリファイルがあります。

$ nc -l localhost 8181 < my.dat

ファイルにはこれが含まれています:

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

私が本当にやりたいことは、16進文字列を直接送信することです。私はこれを試しました:

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

ただし、上記のコマンドはASCII文字列を直接ncに送信するだけです。

51
Chris Snow

-rおよび-pスイッチをxxdに切り替えました:

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

@Gillesの回答からのインスピレーションのおかげで、これはPerlバージョンです:

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

ここで、xxdまたはPerlを使用しないソリューション:

シェルのechoビルトインがサポートしている場合(bashおよびzshはサポートしますが、 dash はサポートしません)、必要なのは正しいバックスラッシュエスケープを使用するには:

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

あなたが持っている場合 /bin/echo from GNU coreutils (Linuxシステムではほぼ標準)またはbusyboxからも使用できます。

sedを使用すると、エスケープされたパターンを生成できます。

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

結合:

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

xxdがあれば簡単です。16進数との間で変換できます。

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

POSIXツールのみを使用して16進数を2進数に変換する妥当な(そしてかなり高速な)方法はないと思います。それはPerlでかなり簡単に行うことができます。次のスクリプトは、16進数ではない入力文字を無視して、16進数を2進数に変換します。入力行に奇数の16進数字が含まれている場合、文句を言います。

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

本当にPOSIXに固執する必要がある場合(たとえば、組み込みデバイス上)、16進数ではなく Base64 を使用することをお勧めします。 decode を使用してBase64をデコードできます。入力は encode によって生成されるヘッダー形式と最終行を持つ必要があります。生のBase64にすることはできません。

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

これと同様: https://stackoverflow.com/questions/1604765/linux-Shell-scripting-hex-string-to-bytes/47253233#472532

Stdinからさまざまな変換を実行し、結果をstdoutに出力するツールを作成しました。 cryptocli ddはそれらの変換のみを行い、他には何も行いません。

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

あなたのために働くでしょう。

ツールはオープンソースです。ここで見つけることができます: https://github.com/tehmoon/cryptocli

編集:

私のツールを使用して16進数に直接エンコードすることもできます。

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