【问题标题】:bash - Type characters in hexadecimal notation to standard inputbash - 以十六进制表示法键入字符到标准输入
【发布时间】:2017-01-10 00:38:40
【问题描述】:

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

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

  • 我想写单字节字符,而不是 unicode 字符
  • 我无法通过管道输出 echo 之类的东西

在 OS X¹ 上,您可以使用以下方式进行测试:

nm - -

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

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

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

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

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

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

¹ linux 上的nm 不处理stdin

【问题讨论】:

  • 这取决于终端模拟器。可能无法在键盘上键入所有字符。

标签: bash character-encoding hex stdin


【解决方案1】:

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

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 --> 我们需要一个子 shell 来继续向 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

【讨论】:

  • 确实,在我意识到这个问题与逆向工程密切相关的几个月后。与(python -c '...'; cat) | ./bin 甚至(python -c '...'; sleep 0.1; cat) | ./bin 的竞争条件起到了作用。谢谢!
【解决方案2】:

试试像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,了解这些实用程序可以执行的各种技巧。

【讨论】:

  • 遗憾的是,我无法将这些工具的输出通过管道传输到我的程序,因为我必须“关闭”标准输入,然后重新打开它。管道不起作用,所以我想知道如何在没有管道的情况下将非 ascii 非 unicode 字符键入或粘贴到标准输入中
  • @Bilow,如果您有 bash,请尝试使用带有 process substitution 的代码,如下所示:nm &lt;(echo ef ed | ascii2binary -b h) -,这会从文件描述符创建一个临时文件,(包含代码的输出括号),因此应该释放第二个- 以接收stdin。另见OS X / Linux: pipe into two processes?
  • 进程替换是个好主意。但我想测试那个非常特殊的情况,其中两个输入都是标准输入,在 nm 上,更特别是在学生编写的程序上。也许我不能实现我想做的事?
【解决方案3】:

使用 bash,可以回显输入,

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

或者使用cat,多行提示时可能会更舒服:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2012-03-18
    • 2014-05-26
    • 2014-11-04
    • 2021-09-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多