pwnable----lotto和cmd1
lotto
- 連上去看源代碼,發現關鍵代碼
- 分析
輸入一個 6 字節的字符串,與程序隨機生成的 6 字節字符串比較。
看第一個for循環這裏是一個acsii碼1-45,但可顯示的是從33-45,
第二個for循環嵌套的意思是將輸入的6個字節與系統的生成的6個字節只要有一個相同就能cat flag。 - 這裏我選的的’’’’’’
cmd1
- 連接上去,看源代碼
#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=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
- 分析
strstr:
strstr:C 庫函數 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出現字符串 needle 的位置,不包含終止符 ‘\0’。
該函數返回在 haystack 中第一次出現 needle 字符串的位置,如果未找到則返回 null。
putenv:
putenv是用來改變或增加環境變量的內容。
再根據源代碼,我們可以知道,只要cmd中不包括flag sh tmp,就可以執行到system函數中,此時我們的argv[1]中如果包含有cat flag的話,就可以利用cmd1得到flag。
所以我們期望執行的命令是 /bin/cat flag ,因爲傳遞的參數中不能出現 “flag” ,所以我們可以用通配符, 構造命令:
/bin/cat fla?
3.就能get flag