mengkonversi string hex ke biner dan kirim dengan netcat

46

Saya memiliki file biner yang dapat saya kirim netcat:

$ nc -l localhost 8181 < my.dat

File ini berisi ini:

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

Yang benar-benar ingin saya lakukan adalah mengirim string hex secara langsung. Saya sudah mencoba ini:

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

Namun, perintah di atas hanya mengirim string ascii langsung ke nc.

Chris Snow
sumber

Jawaban:

55

Saya menggunakan -r dan -p beralih ke xxd :

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

Berkat inspirasi dari jawaban @Gilles, inilah versi perl:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Chris Snow
sumber
Berfungsi bagus untuk format hex bytea Postgres setelah file \ x terdepan dihapus.
nathancahill
Terima kasih! Berfungsi juga untuk memeriksa kamus Firefox yang sudah dicerna secara nyata! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio
26

Di sini solusinya tanpa xxdatau perl:

Jika echobuilt - in dari shell Anda mendukungnya ( bashdan zshlakukan, tetapi tidak dash), Anda hanya perlu menggunakan backslash kanan lolos:

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

Jika Anda memiliki /bin/echodari GNU coreutils (hampir standar pada sistem Linux) atau dari busybox Anda dapat menggunakannya juga.

Dengan sedAnda dapat menghasilkan pola lolos:

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

Gabungan:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Jofel
sumber
solusi yang sangat bagus!
Chris Snow
2
Mengganti echodengan printfmenghapus dugaan berfungsi jika gema mendukung fitur yang diperluas atau tidak. printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181.
Jaakko
12

Jika sudah xxd, itu mudah: dapat dikonversi ke dan dari heksadesimal.

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

Saya tidak berpikir ada cara yang masuk akal (dan cukup cepat) untuk mengkonversi heksadesimal menjadi biner hanya menggunakan alat POSIX. Ini bisa dilakukan dengan cukup mudah di Perl. Skrip berikut mengonversi heksadesimal menjadi biner, mengabaikan karakter input apa pun yang bukan digit heksadesimal. Ia mengeluh jika saluran input berisi angka ganjil heksadesimal.

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

Jika Anda benar-benar harus tetap berpegang pada POSIX (mis. Pada perangkat yang disematkan), saya sarankan menggunakan Base64 daripada hexadecimal. Anda dapat menggunakan uudecode untuk mendekode Base64. Input harus memiliki format tajuk dan garis akhir yang dihasilkan oleh uuencode , tidak boleh berupa Base64 mentah.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Mirip dengan ini: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Saya menulis sebuah alat yang melakukan berbagai transformasi dari stdin dan memuntahkan hasilnya ke stdout. cryptocli ddhanya akan melakukan transformasi dan tidak ada yang lain.

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

Akan bekerja untukmu.

Alat ini open source, Anda dapat menemukannya di sini: https://github.com/tehmoon/cryptocli

Sunting:

Anda juga dapat menyandikan langsung ke hex menggunakan alat saya:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081
teh bulan
sumber
(1) Apa 616263hubungannya dengan pertanyaan ini? Silakan gunakan data dari pertanyaan. (2) Bisakah Anda menjelaskan cara kerjanya? Harap jangan merespons dalam komentar, edit jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap.
G-Man Mengatakan 'Reinstate Monica'