bash - 在标准输入中以十六进制表示法键入字符
bash - Type characters in hexadecimal notation to standard input
我想将非 ASCII 字符(0xfe
、0xed
等)写入程序的标准输入。
有很多类似的问题,但我没有找到答案,因为:
- 我要写单字节字符,不是unicode字符
- 我无法通过管道传输
echo
之类的输出
在 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
!
我想将非 ASCII 字符(0xfe
、0xed
等)写入程序的标准输入。
有很多类似的问题,但我没有找到答案,因为:
- 我要写单字节字符,不是unicode字符
- 我无法通过管道传输
echo
之类的输出
在 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
!