1. 程式人生 > >pwnable.kr cmd1之write up

pwnable.kr cmd1之write up

變量 雙引號 inux ron argv enter nbsp cnblogs linux通配符

看一下源代碼:

 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 <== 被 括起來的命令先執行

pwnable.kr cmd1之write up