zoukankan      html  css  js  c++  java
  • 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        <== 被 ' ' 括起来的命令先执行 
  • 相关阅读:
    20道JS原理题助你面试一臂之力!
    10实用的JS实用技巧
    10实用的JS实用技巧
    比尔盖茨的30条经典语录
    比尔盖茨的30条经典语录
    成为优秀程序员应该具备的8个特质
    成为优秀程序员应该具备的8个特质
    不懂开发的人员,请不要随意说这功能很容易实现
    不懂开发的人员,请不要随意说这功能很容易实现
    15句乔布斯经典语录(中英文)
  • 原文地址:https://www.cnblogs.com/liuyimin/p/7338117.html
Copyright © 2011-2022 走看看