pwnable.kr—cmd1
解题思路
逐步分析题目的含义:
putenv("PATH=/fuckyouverymuch");
这行代码相当于重写了PATH这个环境变量
if(filter(argv[1])) return 0;
这行对输入argv[1]继续宁过滤处理,如果返回值为真,则return 0.这里我们需要返回值为false。接着查看filter函数:
int r=0;
r += strstr(cmd, "flag")!=0;
r += strstr(cmd, "sh")!=0;
r += strstr(cmd, "tmp")!=0;
return r;
对r进行累加,最后return r.根据上一步,我们知道需要使r=0。那么3个strstr函数的返回值都应当为null(0)。也就是说cmd命令中不能包含flag\sh\tmp字段,也即argv[1]不能包含这些字段。
假如已经通过了filter函数,接下来执行
system( argv[1] );
那么很容易想到令argv[1]=”/bin/cat flag”。于是问题就转化为如何将flag字段转化成其他的。这里有很多方法(都是从writeup那里偷来的,所以就不好意思放在这里了)。我就只列其中一种吧,我最喜欢的~
./cmd1 "/bin/cat f*"
这里使用了linux shell下的特殊字符*(通配符),匹配后边0个或多个任意字符。
遇到的问题
1.卡到filter,没有思路。。。。。。。
我当时有想过能不能在system下边重启一个进程,然后在新进程下可以不管filter的束缚,直接cat flag.现在看来仿佛是可以的啊,比如Set -s(虽然到现在都不理解它的用法).总之当时GG了
2.对/bin/cat很疑惑,为什么执行打开flag文件的时候都需要写”/bin/cat flag”?
后来做其他题目的时候才深刻的理解到linux中一切届文件,cat其实是/bin目录下的一个可执行文件,那么/bin/cat flag就相当于执行了当前目录下/bin目录下的cat这个可执行问价,这个文件(命令)的功能就是打开一个文件显示在屏幕上。
收获
1.putenv(char *envvar):改变/增加环境变量的内容;envvar的格式为:envvar=value(若已存在,则依参数envvar改变;若不存在,new env)
2.strstr(str1,str2):判断str2是否是str1的子串;若是则返回str2在str1中首次出现的地址;若否则返回null。
3.linux环境变量的总结:根据生命周期分可分为永久性和临时性。永久的需要修改相关配置文件,变量永久生效;临时的是用户利用export命令,在当前终端下声明环境变量,关闭shell终端,则变量失效。根据作用域可以分为系统变量和用户变量。前者对系统中的所有用户有效,在/etc/profile中修改,如果想立刻有效执行source /etc/profile,否则重进此用户生效。后者只对特定用户有效,在用户目录下的.bash_profile文件中增加,永久有效。此外,直接运行export命令定义变量,只对当前shell有效,是temporary,export 变量名=变量值,该变量值在当前shell或其子shell下有效,shell关闭则变量失效。
4.bash shell 环境变量分为全局变量和局部变量。前者不仅shell会话可见,创建的子进程也可见;后者只对创建它们的shell会话可见。
5.linux shell中常见的一些符号的使用:
“”(双引):”$”,”`”,”\”都按特殊字符解析,不按字母意思解析,”\$vlocal”指的是变量值
”(单引)字符解析,没有特殊含义
“(反引)内容解析为系统命令;同$()
\(反斜)屏蔽下一个字符的特殊含义
$:传递到脚本中的参数个数
?:0个或1个在其之前的那个普通字符
*:0个或多个之前的那个普通字符
+:1个或多个之前的那个普通字符
^:行首
$:命令退出状态,0无,非0有
|:管道;或
6.grep命令:用于查找文件里符合条件的字符串
7.more命令:基于vi编辑器文本过滤器;全屏方式按页显示文本文件内容;space(下一屏);enter(下一行);B(上一屏)
仍存在的疑惑
1.神奇的软连接~~~~