pwnable.kr題解之input

0x01前言:這關其實和pwn關係不大,主要考察的都是linux下一些函數的操作,考察linux的基本功。涉及到的知識點包括一些經典的函數原型、IO重定向、文件描述符、管道、環境變量、socket編程、符號鏈接等。
這裏順便真心安利一本書,《UNIX環境高級編程》,簡稱APUE書裏介紹UNIX文件和目錄、標準I/O庫、系統數據文件和信息、進程環境、進程控制、進程關係、信號、線程、線程控制、守護進程、各種I/O、進程間通信、網絡IPC、僞終端等方面的內容,還在此基礎上結合函數原型介紹了多個應用示例,如果這本書啃透,正常題型linux下的pwn問題都不大。

0x02
登錄後直接看源文件
在這裏插入圖片描述
可以看到這裏分成了好幾關
先看第一關//argv
第一個if要求傳入100個參數
第二個if要求第A個(也就是ascii的65)參數的值爲’\x00’
第三個if要求第B個(也就是ascii的66)的參數值爲’\x20\x0a\x0d’
這題我們寫c

在這裏插入圖片描述
這裏的execve的原型爲:
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
execve()用來執行參數filename字符串所代表的文件路徑,第二個參數是利用指針數組來傳遞給執行文件,並且需要以空指針(NULL)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。
也就是說代碼中的execve是用於執行input程序的,而作爲傳入的參數,最後要以null結尾,對應代碼中的args[100]=NULL

看第二部分//stdio
read函數原型爲ssize_t read [1] (int fd, void *buf, size_t count);
read()會把參數fd所指的文件傳送count 個字節到buf 指針所指的內存中。
而題目源碼中的fd的0,2分別對應的是stdin,stderr,這裏是讀4個字節到buf
然後調用memcmp
memcmp函數的原型爲 int memcmp(const void *str1, const void *str2, size_t n));其功能是把存儲區 str1 和存儲區 str2 的前 n 個字節進行比較
整理一下,代碼的邏輯就是從stdin中讀4個字節,與\x00\x0a\x00\xff比較,從stderr讀4個字節,與\x00\x0a\x02\xff比較
那麼問題來了,stdin是標準輸入,我們可以直接通過輸入來控制,而stderr,該怎麼控制呢
答案是IO重定向
這裏涉及管道pipe的應用
pipe有兩端,一段write寫入,一端read讀出,這裏解題用到的就是把管道的read重定向到某一個流中,從而進程間可以進行通信。
這裏我們的思路是父進程fork子進程,子進程write需要的四字節到pipe,父進程把pipe的read重定向到stdin,stderr。通過這種方式我們就可以控制stdin和stderr的內容了
先定義pipe
在這裏插入圖片描述

第三關//env
strcmp()用於字符串的比較,getenv()用來取得參數envvar環境變量的內容。參數envvar爲環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格式爲envvar=value。
正常情況下肯定沒有0deadbeef的環境變量,要想if條件成立,肯定需要我們自己寫一個鍵值對
我們可以使用setenv()增加環境變量
setenv()原型爲int setenv(const char *name,const char * value,int overwrite)
函數說明 setenv()用來改變或增加環境變量的內容。參數name爲環境變量名稱字符串。參數 value則爲變量內容,參數overwrite用來決定是否要改變已存在的環境變量。如果沒有此環境變量則無論overwrite爲何值均添加此環境變量
本地寫好源文件
對應代碼爲
setenv("\xde\xad\xbe\xef", “\xca\xfe\xba\xbe”, 1);
這時候execve傳入的第三個參數爲新環境變量數組,我們聲明爲environ
在這裏插入圖片描述

第四關//file
打開名爲”\x0a”的文件,比較前四個字節是否爲”\x00\x00\x00\x00”
這關很簡單,我們相應的用寫權限打開該文件,寫前四個字節即可
在這裏插入圖片描述

第五關//network
代碼的意思是以input這個文件作爲服務器,監聽C端口
通過recv來接收,如果收到的爲\xde\xad\xbe\xef,則通過
我們根據對應的代碼稍微修改下就可以了
在這裏插入圖片描述

在本地編寫完整的代碼
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

通過scp上傳
在這裏插入圖片描述
登錄後切換到相應的路徑編譯源文件
在這裏插入圖片描述
直接執行是會報錯的,因爲當前目錄下沒有flag文件,我們又沒有權限移動它,此時可以考慮使用符號鏈接的方式,通過絕對路徑或者相對路徑的形式指向flag。因爲對符號鏈接文件進行讀寫會表現爲直接對目標文件進行操作
在這裏插入圖片描述
這裏是讓/tmp/yale/flag直接指向/home/input2/flag
然後執行
在這裏插入圖片描述
通關

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章