從Reverse到Stack buffer overflow都有概念之後,剩下的我們就從CTF實戰中繼續學習,我們先從Reverse的簡單題型開始。
在ctf.hackme.quest的CTF裡面,有一題toooomuch,我們先用它來練習。
把程式載下來之後它不會是一個可執行的程式,要先用chmod +x後才可以跑起來,然而跑起來後通常會發現它顯示【No such file or directory】,我們可以用file來查看這個檔案的相關資訊。
發現到它是32bit的ELF,不過我們的環境是64位元,所以這個時候就要安裝libc6:i386讓程式能夠正常執行,Ubuntu用apt下載就可以了。
現在程式可以正常執行了。
我們來看看他在GDB中的樣子,但這邊可以看到它沒有讓我們輸入的gets,但有call一個toooomuch,猜測gets會在裡面。
在這邊我們發現了gets,接著程式會繼續跑到check_passcode,這邊可以推測我們輸入字串後,它會在check_passcode分析我們的字串,如果不符合就會puts出You are not allowed here!,所以我們也需要看看check_passcode裡面在寫什麼。
這個check_passcode程式不長,我們知道這個程式是在比較passcode是否正確,所以可以注意到有可能的關鍵點CMP,CMP在組合語言當中是比較的意思,那就注意到跟CMP有關的程式碼就好,CMP的位置是在EBP-0xc的地方,而看到CMP的上一行可以發現,EBP-0xc是放著EAX的值,而EAX是放著0x3039,0x3039的10進位是12345,再上面是atoi,atoi是C語言中將字串變成整數的一個函數,有點像是將Python的Str格式轉換成Int格式的功能。
從這邊我們就能大概推論出來,我們會輸入一個字串,而這個字串會轉換成整數格式,因此我們的passcode應該會是數字,不然atoi無法順利轉換,再來我們輸入的值會加上12345,最後去比較是否有等於0xd903,而0xd903在10進位是55555。
透過簡單的數學X+12345=55555求X,X=55555-12345,X=43210,所以這題我們就解出來了 (灑花
這邊會有個小遊戲,完成後會找fake_flag,但因為我們沒有這個檔案,所以會出錯,我們nc到網站上去做就成功了。