記一次AWD


  有幸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都沒有寫出來!繼續加油了!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM