我在程序和echo
命令之间发现了意外(对我而言)。
这是我的源代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]){
printf("argv length: %d\n", strlen(argv[1]));
return 0;
}
如果我在参数中使用字节0x09
,它将终止字符串,就像我使用字节0x00
一样。
示例:
user@linux:~$ ./a.out `echo -e '\x41'`
argv length: 1
user@linux:~$ ./a.out `echo -e '\x41\x41'`
argv length: 2
user@linux:~$ ./a.out `echo -e '\x41\x09'`
argv length: 1
user@linux:~$ ./a.out `echo -e '\x41\x09\x41'`
argv length: 1
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
\x09
是制表字符。它不会终止字符串,但是在这里你运行你的参数而不保护它们。
在'\x41\x09'
的情况下,标签字符只是被shell剥离了。
在'\x41\x09\0x41'
的情况下,tab char充当参数分隔符,从而创建另一个参数。
引用由echo
消耗,但echo
在回显时丢失了它,因此需要添加另一个引号。
试试:
./a.out `echo -e "'\x41\x09\x41'"`
你会看到你得到一个3字节的唯一论点
答案 1 :(得分:2)
\x09
是一个标签,因此就像用以下方式提供程序一样:
./a.out A A
第一个参数的长度为1。