老样子连接上去看看
cat一下也可以IDA
#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;
}
先来熟悉一下陌生内容:
putenv(char *envvar):改变/增加环境变量的内容;envvar的格式为:envvar=value(若已存在,则依参数envvar改变;若不存在,new env)
因为putenv(char *envvar)函数是改变环境变量的,所以更改了环境变量后,惯用的ls, cat等命令都不能直接使用;
如果我们查看PATH环境变量,我们可以看到该列表包含二进制文件所在的所有目录。
所以程序执行putenv("PATH=/thankyouverymuch");
覆盖掉了这些,迫使我们输入完整路径,也就是从cat flag
变成/bin/cat flag
。
接下来看一下程序逻辑
首先putenv("PATH=/thankyouverymuch");
改变了环境变量内容
然后if(filter(argv[1])) return 0;
过滤掉命令参数中flag\sh\tmp这三个关键词
最后system( argv[1] );
如果能输入正确就能获得flag
正常来说我们令argv[1]=”/bin/cat flag”
就能获得flag,但是这里在if(filter(argv[1])) return 0;
过滤掉了一些关键词,所以关键办法是躲开这个过滤成功将/bin/cat flag
作为命令参数传达进去,网上有很多办法,这里我选取了最常见的两种
1../cmd1 "/bin/cat f*"
这里使用了linux shell下的特殊字符*(通配符),匹配后边0个或多个任意字符
2../cmd1 "/bin/cat 'f'lag"
字符串拼接大法
完成:)