将十六进制字符串转换为二进制并使用netcat发送


46

我有一个可以发送的二进制文件netcat

$ nc -l localhost 8181 < my.dat

该文件包含以下内容:

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

我真正想做的是直接发送十六进制字符串。我已经试过了:

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

但是,以上命令只是将ascii字符串直接发送到nc

Answers:


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十六进制格式。
nathancahill

谢谢!对于检查清单中的Firefox字典摘要也非常有用!md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd
Avio

26

这里没有xxd或的解决方案perl

如果echo您的shell内置支持(bash并且支持zsh,但不支持dash),则只需要使用正确的反斜杠转义即可:

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

如果你有/bin/echoGNU的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 '18年

12

如果您有xxd,那很容易:它可以与十六进制进行相互转换。

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

我认为没有一种仅使用POSIX工具将十六进制转换为二进制的合理(且相当快)的方法。在Perl中可以很容易地做到这一点。以下脚本将十六进制转换为二进制,而忽略了任何非十六进制数字的输入字符。它抱怨输入行是否包含奇数个十六进制数字。

#!/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(例如在嵌入式设备上),我建议使用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

我编写了一个工具,可以执行从stdin到stdout的各种转换。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

(1)616263与这个问题有什么关系?请使用问题中的数据。(2)您能解释一下它是如何工作的吗?请不要在评论中回复,请修改您的答案以使其更清晰,更完整。
G-Man说'Resstate Monica''Nov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.