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

Bil*_*low 5 bash hex stdin character-encoding

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

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

  • 我想写单字节字符,而不是 unicode 字符
  • 我不能通过管道输出echo什么的

在 OS X¹ 上,您可以测试:

nm - -
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

¹nm在 linux 上不处理stdin

sas*_*bot 5

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

echo -e -n '\xde\xad\xbe\xef\xde\xad\xbe\xef' >/tmp/yo
Run Code Online (Sandbox Code Playgroud)

或者

echo -en \\xde\\xad\\xbe\\xef\\xde\\xad\\xbe\\xef >/tmp/yo
Run Code Online (Sandbox Code Playgroud)

并使您的可执行文件从该文件而不是标准输入中读取

./executable </tmp/yo
Run Code Online (Sandbox Code Playgroud)

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

python -c 'print("\x61\x62\x63\x64")' | /path/to/exe
Run Code Online (Sandbox Code Playgroud)

如果您希望将 stdin 控制传回(以防您尝试执行交互式 shell --> 我们需要一个子 shell 来继续向 stdin 发送输入。否则,在第一次输入之后,可执行文件将按原样退出不会在标准输入上进一步了解)

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

Python 对字节做了一些处理。因此,对于 Python3,您必须执行以下操作:

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

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