pwnable.kr之cmd2

Posted by rk700 on November 9, 2016

这道题目与cmd1类似,也是设置了环境变量PATH,并检查输入的命令是否包含敏感字符串。所不同的是,这次把其他环境变量都清空了,所以需要通过别的方式来绕过。

具体地,检查敏感字符串如下:

r += strstr(cmd, "=")!=0;
r += strstr(cmd, "PATH")!=0;
r += strstr(cmd, "export")!=0;
r += strstr(cmd, "/")!=0;
r += strstr(cmd, "`")!=0;
r += strstr(cmd, "flag")!=0;

这里,我们仍然要执行放在/tmp目录下的脚本,而且仍然要提供绝对路径。所以,我们通过shell的内置命令来完成。具体地,eval可将其后的字符串作为命令执行,我们接下来就需要构造目标字符串。

由于PATH的原因,我们依然使用内置命令来完成。具体地,我们使用printf,并且通过8进制的方式绕过对敏感字符的检查。本来是想直接使用16进制的方式,但不知为何,在目标环境上打印不出来。

为了得到目标字符串的8进制表示,我们使用如下命令:

$ echo -n '/tmp/ncmd2' | hexdump -v -e '"\\" 1/1 "%03o"'

随后,就可以通过printf "\xxx"这种方式得到目标字符串了。由于反引号也是敏感字符,所以我们使用$()的方式得到命令结果作为字符串。最终,调用eval执行

Edit: 后来发现,可以直接通过$()的方式将得到的字符串作为名称执行,不需要再使用eval