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


46

私は一緒に送信できるバイナリファイルを持っています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ます。

回答:


55

-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

先頭の\ xが削除されると、Postgresのbytea 16進形式に最適です。
ナタンカヒル

ありがとう!マニフェストでFirefoxの辞書ダイジェストをチェックするのにも最適です!md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

ここではない溶液xxdまたはperl

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

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

あなたがお持ちの場合/bin/echoからの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

非常に素晴らしい解決策!
クリススノー

2
で置き換えるechoprintf、エコーが拡張機能をサポートするかどうかの推測作業が削除されます。printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Jaakko

12

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

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

POSIXツールのみを使用して16進数をバイナリに変換するための合理的な(そしてかなり高速な)方法はないと思います。Perlではかなり簡単に行えます。次のスクリプトは、16進数をバイナリに変換し、16進数以外の入力文字を無視します。入力行に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を使用することをお勧めします。uudecodeを使用してBase64をデコードできます。入力は、ヘッダー形式とuuencodeによって生成された終了行を持っている必要があり、生のBase64にすることはできません。

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

1

これに似ています:https : //stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

標準入力からさまざまな変換を実行し、その結果を標準出力に出力するツールを作成しました。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)616263この質問には何が関係しますか?質問のデータを使用してください。(2)これがどのように機能するか説明できますか?コメントでは返信せず、回答を編集してより明確で完全なものにしてください。
G-マンは「元に戻すモニカ言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.