有幸bjx師傅又讓我參加了一次awd,算是第二次體驗awd,又感覺學習到了很多東西。
第一次打這種模式的時候,我幾乎什么都沒有做,就給師傅們下載文件,上傳文件了。(太菜了)
昨晚分的組,發現沒有人是pwn方向的,那么就只能我一個人來負責pwn了。昨晚和今早簡單的學習了一下patch,突然感覺patch比寫exp腳本要簡單一些。
今天的比賽也沒有寫exp拿分,一直在補自己程序的漏洞。
先說一說pwn1吧
pwn1
這里有一個這樣的知識點,就是在c語言中生成隨機數,其實是一個偽隨機數,在調用rand之前需要先用srand,而srand是初始化隨機數發生器。
srand() 用來設置 rand() 產生隨機數時的隨機數種子。參數 seed 必須是個整數,如果每次 seed 都設相同值,rand() 所產生的隨機數值每次就會一樣。
這就意味着,現在我可以直接用腳本跑出每次v3的值。
腳本:
1 #include<stdio.h> 2 int main() 3 { 4 srand(0);//產生隨機數種子 5 int i; 6 for(i=0;i<5;i++) 7 { 8 int rand_num=(rand()%5); 9 printf("%d\n",rand_num); 10 } 11 return 0; 12 }
這樣我就知道switch先進入的是3了,那么我們看看3這個函數干了些什么。
大概就是先讓你往buf輸入東西,然后進入sub13B0函數,s1是返回值,再判斷s1和"aXdhbmFmbGFn"是否相等,如果相等就輸出flag,這個時候我們就修補read函數的參數,將fd修改成0,這個漏洞就算是patch掉了!
修改之后
第一個over,接下來是進入1,看看1干了些什么。
這里其實就帶一點盲猜了,v3大於0x63就執行下面的命令,我就想,不能那么容易被繞過,這里就把0x63修改成了0x99,就讓過更難一些,當時具體也沒分析出來了,就這樣過去了。
接下來是進入2,2是一個堆題目,我掃了一眼是沒發現毛病。。。
接下來就是0,這里的read是可以進行溢出的,雖然題目開啟了canary保護,但是相信師傅們前面就可以leak出來canary,這里想着, 那就多打一次補丁,讓buf只能輸入兩位數吧。
接下來看到system函數,相必這里也是一個getshell的第一點,但是我覺得patch的差不多了,也就沒有再管。到這里就是我對pwn1的全部補丁。接下來看一下pwn2
pwn2
堆才剛開始學,也不會。。。
是常見的菜單題,我在delete函數中發現了這個,很明顯的一個uaf漏洞,按道理,uaf漏洞修補需要將指針清0,但是這個patch我是真不會打。網上教程也不多,只知道大概思路是將這樣的將call free ----> call .eh_frame地址,然后在.eh_frame的地址上寫指針清零的匯編,然后寫個ret再調回去。這樣就不會覆蓋其他數據了。
但是。。。我在.eh_frame上寫匯編一直不成功,可能是.eh_frame段沒有執行權限的原因,我也不會用ida給.eh_frame段賦執行的權限。。。就卡死了。。。
記:參加了這次awd確實又學習到不少操作,中間大概有一個半小時,我pwn1沒法替換源文件,一直不知道怎么回事,后來重啟了一次還不行,重啟了第二次才又可以替換了。大概打到后面,pwn1幾乎沒有失多少分。感覺做的很不錯了。pwn2實在不會修復,不過師傅們寫腳本寫的也慢,最后30分鍾的時候,我們的pwn2才被打。也就是最后30分鍾pwn2一直被打,pwn1一直安全。唉,還是自己太菜了,一個exp都沒有寫出來!繼續加油了!