0x01前言
這關(guān)其實(shí)和pwn關(guān)系不大 , 主要考察的都是linux下一些函數(shù)的操作 , 考察linux的基本功 。涉及到的知識(shí)點(diǎn)包括一些經(jīng)典的函數(shù)原型、IO重定向、文件描述符、管道、環(huán)境變量、socket編程、符號(hào)鏈接等 。
這里順便真心安利一本書 , 《UNIX環(huán)境高級(jí)編程》 , 簡(jiǎn)稱APUE書里介紹UNIX文件和目錄、標(biāo)準(zhǔn)I/O庫、系統(tǒng)數(shù)據(jù)文件和信息、進(jìn)程環(huán)境、進(jìn)程控制、進(jìn)程關(guān)系、信號(hào)、線程、線程控制、守護(hù)進(jìn)程、各種I/O、進(jìn)程間通信、網(wǎng)絡(luò)IPC、偽終端等方面的內(nèi)容 , 還在此基礎(chǔ)上結(jié)合函數(shù)原型介紹了多個(gè)應(yīng)用示例 , 如果這本書啃透 , 正常題型linux下的pwn問題都不大 。
0x02
登錄后直接看源文件
可以看到這里分成了好幾關(guān)
先看第一關(guān)//argv
第一個(gè)if要求傳入100個(gè)參數(shù)
第二個(gè)if要求第A個(gè)(也就是ascii的65)參數(shù)的值為’\x00’
第三個(gè)if要求第B個(gè)(也就是ascii的66)的參數(shù)值為’\x20\x0a\x0d’
這題我們寫c
這里的execve的原型為:
int execve(const char * filename,char * const argv[ ],char * const envp[ ]); execve()用來執(zhí)行參數(shù)filename字符串所代表的文件路徑 , 第二個(gè)參數(shù)是利用指針數(shù)組來傳遞給執(zhí)行文件 , 并且需要以空指針(NULL)結(jié)束 , 最后一個(gè)參數(shù)則為傳遞給執(zhí)行文件的新環(huán)境變量數(shù)組 。
也就是說代碼中的execve是用于執(zhí)行input程序的 , 而作為傳入的參數(shù) , 最后要以null結(jié)尾 , 對(duì)應(yīng)代碼中的args[100]=NULL
看第二部分//stdio
read函數(shù)原型為ssize_t read [1] (int fd, void *buf, size_t count);
read()會(huì)把參數(shù)fd所指的文件傳送count 個(gè)字節(jié)到buf 指針?biāo)傅膬?nèi)存中 。
而題目源碼中的fd的0 , 2分別對(duì)應(yīng)的是stdin,stderr , 這里是讀4個(gè)字節(jié)到buf
然后調(diào)用memcmp
memcmp函數(shù)的原型為 int memcmp(const void *str1, const void *str2, size_t n));其功能是把存儲(chǔ)區(qū) str1 和存儲(chǔ)區(qū) str2 的前 n 個(gè)字節(jié)進(jìn)行比較
整理一下 , 代碼的邏輯就是從stdin中讀4個(gè)字節(jié) , 與\x00\x0a\x00\xff比較 , 從stderr讀4個(gè)字節(jié) , 與\x00\x0a\x02\xff比較
那么問題來了 , stdin是標(biāo)準(zhǔn)輸入 , 我們可以直接通過輸入來控制 , 而stderr , 該怎么控制呢
答案是IO重定向
這里涉及管道pipe的應(yīng)用
pipe有兩端 , 一段write寫入 , 一端read讀出 , 這里解題用到的就是把管道的read重定向到某一個(gè)流中 , 從而進(jìn)程間可以進(jìn)行通信 。
這里我們的思路是父進(jìn)程fork子進(jìn)程 , 子進(jìn)程write需要的四字節(jié)到pipe , 父進(jìn)程把pipe的read重定向到stdin,stderr 。通過這種方式我們就可以控制stdin和stderr的內(nèi)容了
先定義pipe
第三關(guān)//env
strcmp()用于字符串的比較 , getenv()用來取得參數(shù)envvar環(huán)境變量的內(nèi)容 。參數(shù)envvar為環(huán)境變量的名稱 , 如果該變量存在則會(huì)返回指向該內(nèi)容的指針 。環(huán)境變量的格式為envvar=value 。
正常情況下肯定沒有0deadbeef的環(huán)境變量 , 要想if條件成立 , 肯定需要我們自己寫一個(gè)鍵值對(duì)
我們可以使用setenv()增加環(huán)境變量
setenv()原型為int setenv(const char *name,const char * value,int overwrite)
函數(shù)說明 setenv()用來改變或增加環(huán)境變量的內(nèi)容 。參數(shù)name為環(huán)境變量名稱字符串 。參數(shù) value則為變量?jī)?nèi)容 , 參數(shù)overwrite用來決定是否要改變已存在的環(huán)境變量 。如果沒有此環(huán)境變量則無論overwrite為何值均添加此環(huán)境變量
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 常用Linux網(wǎng)絡(luò)命令匯總 linux打開網(wǎng)頁命令
- txt轉(zhuǎn)換成kindle格式 txt2mobi通用版怎么用
- 永久免費(fèi)隨身wifi 360wifi驅(qū)動(dòng)電腦版下載
- Win7免費(fèi)永久激活的方法 win7顯示不是正版怎么辦
- 東京殘奧會(huì)日本國旗升錯(cuò)了 殘奧會(huì)的項(xiàng)目有哪些5號(hào)網(wǎng)版權(quán)所有
- 網(wǎng)頁1920×1080設(shè)計(jì)規(guī)范 韓國網(wǎng)頁設(shè)計(jì)素材
- 人生感悟的句子 生來再平凡也是限量版!
- pscs6有效序列號(hào) cs6正版序列號(hào)是多少
- 一視同仁!Reno4 SE、K9 Pro的ColorOS 12正式版來了,新功能搶先看
- 最詳圖文教程 win7副本不是正版怎么解決
