XCTF pwn新手區解題記錄

一、前言

    閒來無事,刷刷ctf題


二、題目: level0

    1、下載好題目後,拖入到kali中去,用filechecksec查看一下,可以發現該程序是64位,只開了NX保護,如下圖所示:

1.png

    2、拖入到IDA中去,發現在main函數中打印出信息後就調用了vulnerable_function函數,跟進vulnerable_function函數,可以發現read函數處爲棧溢出漏洞,並且可以得知該buf數組距離ebp0x80個字節,如下圖所示:

2.png

3.png

    3、通過IDA,可以發現程序中存在一個名爲callsystem的函數,可以直接getshell,有了這個加上上面的偏移量,就可以直接編寫expexp執行結果如下圖所示:

4.png

5.png


三、題目: level2

    1、下載好題目後,首先使用filechseksec,可以發現程序是32位並且開了NX的,如下圖所示:

6.png

    2、拖入到IDA當中去,可以發現程序首先調用vulnerable_function函數後就打印一串字符串就結束了,跟進到vulnerable_function中去,可以發現read存在棧溢出,並且buf距離ebp0x88,如下圖所示:

7.png

8.png

    3、上面我們找到了buf距離返回地址的偏移量(0x88+4),仔細觀察,我們可以發現存在_system函數可以getshell,跟進去該函數後,可以發現,需要傳入字符串/bin/sh作爲參數才能getshell,使用快捷鍵shift+F12調出字符串界面,發現了該字符串,那麼我們的payload應該爲0x8C * b'A' + p32(_system函數地址) + p32(0) + p32(/bin/sh字符串地址)(PS:這裏之所以有一個p32(0),是因爲我們正常調用一個函數時,棧從高到底的結構爲:參數 返回地址 ebp,所以這裏我們需要提供一個虛假的返回地址以模擬正常的調用過程),最後exp執行結果如下圖所示:

9.png

10.png

11.png


四、題目: string

    1、下載好題目後,拖入到kali中去,用filechecksec查看一下,可以發現該程序是64位,如下圖所示:

12.png

    2、將程序拖入到IDA中去,在main函數中,首先調用alarm函數設置了0x3C秒後關閉程序,然後給變量v4申請了8個字節的空間,並且給v4[0]賦值爲68v4[1]賦值爲85,之後就是調用puts函數打印一些信息,然後就調用sub_400D72函數,並且將v4數組作爲參數傳入,之後main函數就結束退出了,如下圖所示:

13.png

    3、跟進sub_400D72中去,該函數首先要求輸入一個名字,如果長度小於等於0xC,則創建一個角色,然後依次調用sub_400A7Dsub_400BB9sub_400CA6函數,否則就退出,如下圖所示:

14.png

    4、跟進到sub_400A7D中去,該函數只有輸入east才能正常返回,如下圖所示:

15.png

    5、接着跟進到sub_400BB9中去,該函數首先要求我們輸入一個數字,如果輸入的數字爲1,則進入一個if裏面去,在該if塊裏面,首先要求輸入一個數字,然後要求輸入一串字符串,緊接着該函數直接將該字符串作爲參數傳入到printf函數中去了,很明顯的格式化字符串漏洞,如下圖所示:

16.png

    6、接着分析一下sub_400CA6,該函數首先調用puts函數打印一些信息,然後判斷參數數組a[0]是否等於a[1],如果相等,則申請一片空間,然後通過read函數獲取用戶輸入寫入到剛剛申請到的空間中,然後把該空間中的值作爲一段代碼執行,而這裏的參數數組就是main函數的v4數組,如下圖所示:

17.png

    7、有了上面的分析,可以很明顯得出解題的方法,首先利用格式化字符串漏洞,將v4[0]=v4[1],然後寫入shellcodegetshell,首先我們來尋找一下偏移量,執行程序,輸入名字之後,輸入east,然後輸入1,之後輸入payload測試偏移量,從下圖可以看出,偏移量爲8,如下圖所示:

18.png

    8、有了偏移量,就可以寫exp了,但這裏有一個小坑,__isoc99_scanf函數這裏前幾個字節沒辦法直接作爲地址寫入(PS:事後對比了其他師傅的wp,發現IDA反編譯出來的內容都有點不同,不知道是不是這個原因),這裏使用代碼中前面輸入那個地址,偏移量爲7,在上面的圖片中已標註,執行exp,結果如下圖所示:

19.png


五、題目: guess_num

    1、首先下載好題目,拖入kali中查看一下基礎信息,可以發現爲64位的程序,如下圖所示:

20.png

    2、拖進IDA中,發現程序首先生成了一個隨機種子,然後調用gets函數獲取輸入,典型的棧溢出漏洞,但前面保護全開,也沒法直接覆蓋返回地址來rce,往下接着看,要求用戶練着猜10次並且全部正確就可以得到flag,前面存在一個棧溢出,雖然沒辦法來rce,但可以用來覆蓋隨機化種子,有了種子,我們就可以直接提前計算出來隨機值,而gets輸入距離種子偏移量爲0x20,如下圖所示:

21.png

22.png

    3、直接使用c算出隨機值,然後nc連接上去即可得到flag(PS:不知道我的python腳本爲啥一直得不到flag,這裏就直接簡單粗暴的nc連接了),如下圖所示:

23.png

24.png

25.png


六、題目: get_shell

    nc連接即可,如下圖所示:

26.png


七、題目: int_overflow

    1、還是首先拖入到kali中查看一下基礎信息,可以發現是32位的程序,如下圖所示:

27.png

    2、運行一下程序,沒發現什麼有意思的東西,拖入到IDA中去,根據運行時的字符串,定位到了main函數中去,分析一下main函數,就是一個登錄流程,沒什麼可疑的地方,如下圖所示:

28.png

29.png

    3、跟進到login函數中去,可以發現最多可以輸入0x199大小的密碼,其餘地方也沒什麼可疑的,如下圖所示:

30.png

    4、跟進到check_passwd函數中去,首先可以發現當中的v3變量大小是一字節,然後程序將密碼字符串的大小賦值給了v3,之後判斷v3是否小於3,大於8,如果是,就退出,否則就打印信息並將密碼拷貝到dest數組中去,結合題目名的提醒,可以發現這裏存在整數溢出漏洞,可以繞過其對v3的判斷,然後棧溢出覆蓋返回地址,如下圖所示:

31.png

    5、那麼v3等於多少時能繞過喃,這裏v3只有一個字節大小,所以我們只需要使我們輸入的密碼長度的最後一個字節爲4,5,6,7,8之中的一個即可,這裏密碼最多可輸入0x199字節,寫一個判斷腳本跑一下所有可能,如下圖所示:

32.png

    6、這裏選擇第一個260,接下來我們還需要偏移量,IDA已經給出了,爲0x14ebp,那麼我們覆蓋0x18字節之後即可覆蓋返回地址,在該程序中,還存在一個直接獲取flag的函數what_is_this,我們直接將返回地址覆蓋爲這個函數地址即可拿到flagexp執行結果如下圖所示:

34.png

33.png


八、題目: cgpwn2

    1、下載好題目之後,拖入kali中簡單查看一下程序信息,可以發現該程序爲32位,並且開了NX,如下圖所示:

35.png

    2、將程序拖入到IDA中,首先查看main函數,該函數沒什麼可疑的,如下圖所示:

36.png

    3、跟進到hello函數中去,可以發現在函數末尾調用了gets函數,很明顯的棧溢出,並且從IDA反編譯的結果我們可以知道數組s距離ebp0x26,也就是說0x26 + 4個字節的偏移量後即可覆蓋到返回地址,如下圖所示:

37.png

    4、因爲題目開了NX,沒辦法在棧上直接部署shellcode來執行,仔細觀察,我們發現提供了system函數,但是沒有提供/bin/sh字符串,我們只要想辦法制造一個/bin/sh字符串即可getshell,在hello函數中,程序還調用了fgets函數獲取輸入儲存到name變量中,查看name位置可以發現name位於bss段中,那麼exp的思路就是首先在程序調用fgets處輸入/bin/sh;字符串,然後再調用gets函數處溢出覆蓋返回地址爲system函數地址,exp執行結果如下圖所示:

38.png

39.png


九、題目: level3

    1、下載好題目,拖入到kali中去,查看一下程序的基本信息,可以發現程序爲32位的,並且開了NX,如下圖所示:

40.png

    2、將程序拖入到IDA中去,首先看一下main函數,main函數首先調用了一個vulnerable_function函數,然後就是調用了write輸出信息到控制檯中,沒什麼存在漏洞的地方,如下圖所示:

41.png

    3、跟進到vulnerable_function函數中去,可以發現該函數調用的read函數存在棧溢出,並且IDA已經計算出來buf距離ebp0x88,那麼覆蓋0x88 + 4 = 0x8C個字節之後即可覆蓋返回地址,如下圖所示:

42.png

    4、仔細觀察該程序,可以發現沒有system等現成的函數可以讓我們直接getshell,但是存在libc和已經調用過的write函數,並且題目還給了libc.so文件,那麼思路就很明顯了,首先棧溢出調用write函數輸出write函數的地址,進而獲取到libc的基地址,因爲libc.so中存在system函數和/bin/sh字符串的偏移地址,加上基地址就可以得到對應的絕對地址,之後再棧溢出調用write時將返回地址設置爲vulnerable_function函數的首地址,再次棧溢出覆蓋返回地址爲前面計算出的system的絕對地址即可getshellexp執行結果如下圖所示:

43.png


十、題目: cgfsb

    1、下載好題目,拖入到kali中去,查看一下程序的基本信息,可以發現程序爲32位的,並且開了NX,如下圖所示:

44.png

    2、拖入到IDA中去,可以發現程序首先要求我們輸入一個名字,然後輸入一串信息,之後直接將信息作爲傳入到了printf函數裏面去了,典型的格式化字符串漏洞,之後則判斷pwnme變量是否等於8,如果等於8,則輸出flag,如下圖所示:

45.png

    3、經過上面的分析,那麼解題的思路就很明顯了,利用格式化字符串漏洞將pwnme變量修改爲8即可。那麼現在需要確定兩個東西,一個是偏移量,另一個是pwnme變量的地址,仔細觀察可發現,pwnme變量不是函數局部變量,而是bss段的一個變量,雙擊變量名即可獲得地址,至於偏移量怎麼確定,這麼不過多敘述了,不明白的可以看我上一篇文章https://www.cnblogs.com/aWxvdmVseXc0/p/15734510.html,這裏計算出來偏移量爲10,如下圖所示:

46.png

47.png

    4、最後exp執行結果如下所示:

48.png


十一、題目: hellopwn

    1、下載好題目,拖入到kali中去,查看一下程序的基本信息,可以發現程序爲64位的,並且開了NX,如下圖所示:

49.png

    2、拖入到IDA當中,進入到main函數,會發現程序首先輸出一些信息,然後調用read函數獲取輸入,之後比較dword_60106C變量是否等於0x6E756161,如果相等,這調用sub_400686函數,跟進sub_400686函數,會發現該函數作用爲輸出flag,如下圖所示:

50.png

51.png

    3、有了上面的分析,那麼解題的思路就很明顯了,利用read函數溢出覆蓋dword_60106C變量爲0x6E756161,仔細觀察一下,會發現unk_601068變量增長4個字節到dword_60106C,既偏移量爲4,最後exp執行結果如下圖所示:

52.png

53.png


十二、相關鏈接

    題目和expgithub鏈接: https://github.com/windy-purple/XCTF_PWN

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