bash - 在标准输入中以十六进制表示法键入字符

bash - Type characters in hexadecimal notation to standard input

我想将非 ASCII 字符(0xfe0xed 等)写入程序的标准输入。

有很多类似的问题,但我没有找到答案,因为:

在 OS X¹ 上你可以测试:

nm - -

我想使用标准输入将目标文件魔术字节(例如 0xfeedface)写入 nm,这样我就可以看到它的行为方式并重新编码。

如果我使用管道,那么第二个参数 -,这意味着 stdin,将永远不会匹配任何字节,因为所有标准输入都将转到第一个.当使用终端而不是管道时,我可以输入 Ctrl + D 这样第一个得到 'closed' 并且第二个开始读取。

我尝试使用 Ctrl + Shift + U 和 OS X 的 Unicode 十六进制输入,但它不起作用——我无法用它写出所需的字符。

我也尝试过使用带有 pbcopy 的剪贴板,但它无法 read/paste 非 ASCII 或非 unicode 字符。

我怎样才能实现我的目标?

不要犹豫编辑,因为这是一个很难表达的问题。

¹ linux 上的 nm 不处理 stdin.

尝试像 xxd 这样的实用程序:

# echo hex 52 to pipe, convert it to binary, which goes to stdout
echo 52 | xxd -r ; echo
R

或者对于更专业的实用程序,请尝试 ascii2binary(默认输入为十进制):

# echo dec 52 to pipe, convert it to binary, which goes to stdout
echo 52 | ascii2binary  ; echo
4

# echo base11 52 to pipe, convert it to binary, which goes to stdout
echo 52 | ascii2binary -b 11 ; echo
9

或转储一系列十六进制字符,显示 hexdump 看到的内容:

echo 7 ef 52 ed 19 | ascii2binary -b h  | \
    hexdump -v  -e '/1  "%_ad#  "' -e '/1 " _%_u\_\n"'
0#   _bel_
1#   _ef_
2#   _R_
3#   _ed_
4#   _em_

请参阅 man xxd ascii2binary 了解这些实用程序可以执行的各种技巧。

您可以回显您想要的十六进制代码到一个文件中。

echo -e -n '\xde\xad\xbe\xef\xde\xad\xbe\xef' >/tmp/yo

echo -en \xde\xad\xbe\xef\xde\xad\xbe\xef >/tmp/yo

并让你的可执行文件从这个文件而不是标准输入中读取

./executable </tmp/yo

如果您不想创建文件,这里有一个替代方法

python -c 'print("\x61\x62\x63\x64")' | /path/to/exe

如果您希望将 stdin 控制权转回(以防您尝试执行交互式 shell --> 我们需要一个 subshell 来继续向 stdin 发送输入。否则,在第一次输入后,可执行文件将退出,因为它不会在 stdin 上获得任何进一步信息)

( python -c 'print("\x61\x62\x63\x64")' ; cat ) | /path/to/exe

Python 对字节进行一些处理。因此,如果 Python3,您必须执行以下操作:

( python -c 'import sys; sys.stdout.buffer.write(b"\x61\x62\x63\x64")' ; cat ) | /path/to/exe

这个答案帮助了我: https://reverseengineering.stackexchange.com/questions/13928/managing-inputs-for-payload-injection

使用bash,你可以回显输入,

echo -e -n '\x61\x62\x63\x64' | /path/someFile.sh --nox11

或者用cat,当有几行提示的时候可能更舒服:

cat $file | /path/someFile.sh --nox11

您可以省略 --nox11,但这在脚本生成新的终端实例时可能会有所帮助

注意:这不适用于 /bin/sh!