拿到程序我们打开源代码如下:
#include <stdio.h>
#include <string.h>int filter(char* cmd){int r=0;r += strstr(cmd, "flag")!=0;r += strstr(cmd, "sh")!=0;r += strstr(cmd, "tmp")!=0;return r;
}
int main(int argc, char* argv[], char** envp){putenv("PATH=/thankyouverymuch");if(filter(argv[1])) return 0;system( argv[1] );return 0;
}
emmmm…strstr这个函数不认识。。。让我来man一下
也就是如果找不到所需要的字符串的话返回NULL,找到的话返回第一次出现的位置。(nowhere作形容词时为不存在
的意思)
再根据源代码,我们可以知道,只要cmd中不包括flag sh tmp,就可以执行到system函数中,此时我们的argv[1]中如果包含有cat flag的话,就可以利用cmd1得到flag。
这里通过函数改变了环境变量putenv("PATH=/thankyouverymuch");
因此更改了环境变量后,惯用的ls, cat等命令都不能直接使用,但我们通过完整路径来使用,如/bin/cat
;
所以我们期望执行的命令是 /bin/cat flag
,因为传递的参数中不能出现 “flag” ,所以我们可以用通配符, 构造命令:
/bin/cat fla?