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)
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)