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

时间:2017-01-10 00:38:41

标签: bash character-encoding hex stdin

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

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

  • 我想写单字节字符,而不是unicode字符
  • 我无法管道echo
  • 的输出

在OSX¹上,您可以使用以下方法进行测试:

nm - -

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

如果我使用管道,那么第二个参数-,即 stdin ,将永远不会匹配任何字节,因为所有标准输入都将转到第一个。当使用终端而不是管道时,我可以输入Ctrl + D,以便第一个“关闭”,第二个开始读取。

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

我还尝试使用pbcopy的剪贴板,但无法读取/粘贴非ASCII或非Unicode字符。

我如何实现目标?

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

¹linux上的nm无法处理 stdin

3 个答案:

答案 0 :(得分:2)

尝试像xxd这样的工具:

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

或者对于更专业的util try 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

答案 1 :(得分:2)

您可以将所需的十六进制代码回显到文件中。

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

并使您的可执行文件从此文件而不是stdin读取

./executable </tmp/yo

如果您不想创建文件,则可以选择

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

如果您希望将stdin控件转移回

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

此答案对我有帮助: https://reverseengineering.stackexchange.com/questions/13928/managing-inputs-for-payload-injection

答案 2 :(得分:0)

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

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

或使用cat,当有几行提示时,这可能会更舒适:

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

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

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