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

Chr*_*now 63 linux binary netcat

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

$ nc -l localhost 8181 < my.dat
Run Code Online (Sandbox Code Playgroud)

该文件包含以下内容:

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC
Run Code Online (Sandbox Code Playgroud)

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

$ echo '0006303030304e43' | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*now 83

我将-r-p开关用于xxd

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)

感谢@Gilles 的回答,这里有一个 Perl 版本:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)


jof*_*fel 32

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

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

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)

如果您有/bin/echo来自GNU coreutils(几乎是 Linux 系统的标准)或来自 busybox,您也可以使用它。

有了sed你可以生成一个逃脱模式:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
Run Code Online (Sandbox Code Playgroud)

综合:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)

  • 如果 echo 支持扩展功能或不支持,用 `printf` 替换 `echo` 可以消除猜测工作。`printf "$(echo '0006303030304e43' | sed -e 's/../\\x&amp;/g')" | nc -l 本地主机 8181`。 (4认同)

Gil*_*il' 14

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

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Run Code Online (Sandbox Code Playgroud)

我不认为仅使用 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"; }
Run Code Online (Sandbox Code Playgroud)

如果您确实需要坚持使用 POSIX(例如在嵌入式设备上),我建议使用Base64而不是十六进制。您可以使用uudecode解码 Base64。输入必须具有uuencode生成的标题格式和结束行,它不能是原始 Base64。

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Run Code Online (Sandbox Code Playgroud)