如果我的术语有点偏离,我很抱歉,但我正在努力弄清楚为什么一个有效,另一个无效。我有这个程序,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[], char* envp[]){
printf("argc: %dn", argc);
if(argc != 10) {
printf("argc incorrectn");
return 0;
}
if(strcmp(argv[4],"x00"))
{
printf("argv[4] incorrectn");
return 0;
}
if(strcmp(argv[5],"x20x0ax0d"))
{
printf("argv[5] incorrectn");
return 0;
};
printf("yesn");
}
一段时间以来,我一直在尝试使用mix来传递strcmp部分命令和/或进程替换和python,但我搞不清楚如何使其工作,例如
./compartx $(python -c 'print("A " * 4)'; python -c 'print("x00")'; python -c 'print("B " * 5)';)
[我正试图通过argv[4]的第一次检查,更不用说argv[5]了暂时]
我确实看到了警告";命令替换忽略了输入中的nullbyte";。有网络上的许多帖子暗示不可能传递null字节到argv,但我今天早上浏览了bash手册,我成功了使用此参数传递strcmp部分
./compartx {0..2} $' ' $' nr' {0..3}
有没有任何方法可以使用python实现同样的事情?
干杯,Sven
尝试在shell命令行中进行插值是没有意义的;而且很可能它无论如何都不能在一个插值中工作!
如果您需要使用Python来生成参数,那么也可以使用Python来运行命令:
import subprocess
subprocess.run([
'./compartx',
'1', '2', '3',
# strcmp will stop at the first null byte, so empty string will do here
'',
'x20x0ax0d',
'6', '7', '8', '9'
])
运行它,你就会得到
argc: 10
yes
无需发送NUL
;只需传递空字符串。strcmp
无论如何都停在NUL
字节,而C中的空字符串只是NUL
;明确地传递一个额外的NUL
不会改变行为(它击中第一个并停止(。