我想使用Linux Bash Shell将原始字节传递给(C)程序。我发现当我尝试传递例如“ \ x00 \ xFF \ xAB”时,接收输入的程序实际上会获取字符串的ASCII字符代码,而不是将它们解释为原始字节。

我见过人们实现此目标的一种方法是调用python -c 'print("\x00\xFF\xAB")'并将输出管道传递给被测程序。有没有办法只使用Bash shell而不使用Python?

评论

您可以使用“ printf \ xbb”,在其中用所需的字节替换“ bb”。唯一的问题是,您不能以这种方式传递空字节。

啊,谢谢,您知道我该如何传递空字节吗?

不幸的是,我没有。 :/

@ bart1e谢谢,我认为没有办法做到这一点。对于空字节,我可能必须手动运行execve并传递我认为的args。

@ bart1e:您可以使用printf打印NUL字节。您只是无法将它们保存在变量中。

#1 楼

使用echo -e并通过管道传递到程序的输入。

示例:
echo -e "\x41\x42\x43\x44" | <executable>
将ABCD编写为输入。

编辑:
您可以传递空字节

评论


您介意添加一个示例,说明如何将字节作为参数传递给可执行文件吗?

–伍德罗·巴洛
4月20日14:04



将echo -e命令放在可执行文件名称的后面,并用反引号(())引起来。在此方法中也可以使用空字节。 (但是,换行符会打断字符串)

– Yotamz
4月20日15:40



@Yotamz yikes ...反引号?那是1990年代。放下反引号,并使用$(...)来躲避一旦开始嵌套反引号时就发生的逃避的噩梦...参数中是否可以使用空字节?我发现这令人惊讶,因为它们被视为零终止。您可以证实这一说法吗?

– 0xC0000022L♦
4月23日下午6:39

是的,使用ls进行了尝试,即使假定它以字符串结尾,echo -e“ \ x2E \ x2E”(ls ..)的工作原理也与具有echo“ \ x2E \ x00 \ x2E”的ls相同。我希望后者被视为“ \ x2E”并列出当前文件夹,但事实并非如此。不过,我同意你在反引号上的转义。

– Yotamz
4月23日8:14



#2 楼

如果需要空字节,则可以将它们写入文件,并将该文件用作程序的输入,例如:

echo -e -n“ \ x00 \ xFF \ xAB”> file.bin
程序
还可以使用xxd将十六进制转换为二进制:

回显“ 00 FF AB” | xxd -r -p |程序


评论


支持使用xxd –无需反斜杠,使用起来更加方便。

–赫尔曼
4月19日下午21:55