![十六进制输入的终端转义字符](https://linux22.com/image/1211576/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E8%BE%93%E5%85%A5%E7%9A%84%E7%BB%88%E7%AB%AF%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6.png)
在我常用的 gnome 终端中我执行
netcat -u somewhere 1234
开始将 UDP 数据包发送到某个地方。我需要传输以下 5 个字节,以十六进制表示:“01 00 af 0f e1”。现在,如何在终端中输入转义序列,使其将这 5 个字节精确发送到 netcat 的标准输入?
更新: 只是为了澄清一下。我知道几种实际向程序输入我想要的字节的方法。这不是问题。问题是,在程序启动后,我要在终端中输入什么按键序列才能输入键盘上没有显示的十六进制字符。(例如 0x00、0x01 或 0x0f。)
我开始认为这根本不可能,但是如果这是结论的话我会有点惊讶。
答案1
您可以使用echo -e
, (我认为这就是 richardhoskins 的意思。)像这样:
/bin/echo -n -e "\x01\x00\xaf\x0f\xe1" | netcat -u somewhere 1234
# -n: no newline at end, -e: interpret escapes
如果你的 echo 实现比较旧(或者根本不支持 GNU),那么老式的方法是使用八进制:
/bin/echo -n -e "\001\000\257\017\341" | netcat -u somewhere 1234
是的,八进制太老派了。查看man 中的ibase
和。检查 echo 是否正确执行(“八进制转储”)“od -tx1”表示十六进制,“od -to1”表示八进制。obase
bc
od
答案2
这是一个简单的方法,尽管并不完全是您想要的......
使用十六进制编辑器创建一个包含要发送的字节的文件(您提到 gnome,因此您可能已经有 ghex,但任何十六进制编辑器都可以)。对于短十六进制序列,我通常将十六进制作为名称的一部分(例如 test0x0100af0fe1)。
然后只需将内容重定向到netcat
,例如:
mas@voco:~$ nc -o testout 127.0.1.1 80 < test0x0100af0fe1
^C
mas@voco:~$ cat testout
> 00000000 01 00 af 0e 10 # .....
mas@voco:~$
这样做的缺点是必须准备单独的文件,但它使得测试的复制和记录更加容易。
答案3
您必须在终端示例中使用 perl:
。/程序 perl -e' print "\x41\x60\x34\x45"'
它会将这个十六进制地址发送给程序。它经常在缓冲区溢出时用作十六进制地址输入。该页面没有显示我输入的所有内容。在 Google 上查找缓冲区溢出。这些页面会显示所有内容。这里缺少 perl 前面的单引号,以及整个输入末尾的第二个单引号。
答案4
将 \x 附加到字节的开头。例如“\x01 \x00 \xaf \x0f \xe1”。