pwnable.kr cmd1之write up

看一下源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int filter(char* cmd){
 5     int r=0;
 6     r += strstr(cmd, "flag")!=0;
 7     r += strstr(cmd, "sh")!=0;
 8     r += strstr(cmd, "tmp")!=0;
 9     return r;
10 }
11 int main(int argc, char* argv[], char** envp){
12     putenv("PATH=/fuckyouverymuch");
13     if(filter(argv[1])) return 0;
14     system( argv[1] );
15     return 0;
16 }

我们看到filter函数过滤了flag,sh,tmp,我们输入的参数在system执行,然而我们过滤了一些参数,对于linux系统,我们的通配符还没有过滤。题中的思路是我们输入的参数过滤了flag,sh,tmp后system执行该参数。于是我们输入如下,并得到flag:

补充:linux通配符

* - 通配符,代表任意字符(0到多个)
? - 通配符,代表一个字符
# - 注释
/ - 跳转符号,将特殊字符或通配符还原成一般符号
| - 分隔两个管线命令的界定
; - 连续性命令的界定
~ - 用户的根目录
$ - 变量前需要加的变量值
! - 逻辑运算中的""(not)
/ - 路径分隔符号
>, >> - 输出导向,分别为"取代""累加"
' - 单引号,不具有变量置换功能
" - 双引号,具有变量置换功能
` - quote符号,两个``中间为可以先执行的指令
() - 中间为子shell的起始与结束
[] - 中间为字符组合
{} - 中间为命令区块组合
Ctrl+C - 终止当前命令
Ctrl+D - 输入结束(EOF),例如邮件结束的时候
Ctrl+M - 就是Enter
Ctrl+S - 暂停屏幕的输出
Ctrl+Q - 恢复屏幕的输出
Ctrl+U - 在提示符下,将整行命令删除
Ctrl+Z - 暂停当前命令
&& - 当前一个指令执行成功时,执行后一个指令
|| - 当前一个指令执行失败时,执行后一个指令

 

 

其中最常用的是*、?、[]和 ‘。下面举几个简单的例子:

1,ls test*             <== *表示后面不论接几个字符都接受(没有字符也接受)

2,ls test?            <== ?表示后面当且仅当接一个字符时才接受

3,ls test???       <== ???表示一定要接三个字符

4,cp  test[1~5]  /tmp      <== test1, test2, test3, test4, test5若存在,则复制到/tmp目录下

5,cd  /lib/modules/' uname  -r'/kernel/drivers        <== 被 ' ' 括起来的命令先执行 
原文地址:https://www.cnblogs.com/liuyimin/p/7338117.html