बाइनरी स्ट्रिंग को बाइनरी में कनवर्ट करें और netcat के साथ भेजें


46

मेरे पास एक बाइनरी फ़ाइल है जिसे मैं भेज सकता हूं netcat:

$ nc -l localhost 8181 < my.dat

फ़ाइल में यह शामिल है:

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

मैं वास्तव में क्या करना चाहता हूं सीधे हेक्स स्ट्रिंग भेजें। मैंने यह कोशिश की है:

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

हालाँकि, उपर्युक्त कमांड सिर्फ एससीआई स्ट्रिंग को सीधे भेजता है nc

जवाबों:


55

मैंने xxd के लिए -r और -p स्विच का उपयोग किया :

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

@ उत्तर उत्तर से प्रेरणा के लिए धन्यवाद, यहाँ एक पर्ल संस्करण है:

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

प्रमुख \ x धारीदार हो जाने के बाद Postgres के बाइटी हेक्स प्रारूप के लिए बढ़िया काम करता है।
नथनचाहिल

धन्यवाद! प्रकट में फ़ायरफ़ॉक्स शब्दकोशों पचाने के लिए भी महान काम करता है! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
अवियो

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 सिस्टम पर लगभग मानक) या बिजीबॉक्स से आप भी इसे उपयोग कर सकते हैं।

साथ 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
इको को हटाकर अनुमानित कार्य echoको printfहटा दिया जाता है यदि इको विस्तारित सुविधाओं का समर्थन करता है या नहीं। printf "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
जाॅको

12

यदि आपके पास है xxd, तो यह आसान है: यह हेक्साडेसिमल से और में परिवर्तित हो सकता है।

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

मुझे नहीं लगता कि हेक्साडेसिमल को केवल पोसिक्स टूल्स का उपयोग करके बाइनरी में परिवर्तित करने का एक उचित (और उचित रूप से तेज़) तरीका है। यह पर्ल में काफी आसान किया जा सकता है। निम्न स्क्रिप्ट हेक्साडेसिमल को बाइनरी में परिवर्तित करता है, किसी भी इनपुट चरित्र को अनदेखा करता है जो हेक्साडेसिमल अंक नहीं है। यदि इनपुट लाइन में हेक्साडेसिमल अंकों की एक विषम संख्या है, तो यह शिकायत करता है।

#!/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 (उदाहरण के लिए एक एम्बेडेड डिवाइस पर) से चिपके रहने की आवश्यकता है, तो मैं हेक्साडेसिमल के बजाय बेस 64 का उपयोग करने की सलाह देता हूं । आप बेस 64 को डीकोड करने के लिए यूडोस्कोप का उपयोग कर सकते हैं । इनपुट में 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

संपादित करें:

तुम भी सीधे मेरे उपकरण का उपयोग कर हेक्स को सांकेतिक शब्दों में बदलना कर सकते हैं:

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

(१) 616263इस सवाल से क्या लेना-देना है? कृपया प्रश्न से डेटा का उपयोग करें। (२) क्या आप बता सकते हैं कि यह कैसे काम करता है? कृपया टिप्पणियों में प्रतिक्रिया न करें , इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपने उत्तर को संपादित करें।
जी-मैन का कहना है कि 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.