看一下源代码:
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 <== 被 ‘ ‘ 括起来的命令先执行
时间: 2024-09-30 06:18:25