介紹完Stack buffer overflow相關的保護後,可以回想上一次我們做了toooomuch,但他捕捉的是fake_flag,意思就是還有一個是真的flag,不過這次我們沒有要做toooomuch-2,這個會利用到shellcraft功能,我們先來講Return到/bin/sh的樣子!
一樣拿ctf.hackme.quest的CTF題目來做,這次做一個一樣是Return address的題型homework,相較起之前的題目,這個稍微有點小複雜,但還算簡單。
在網站裡面有寫到原始碼,很明顯就是要跳到call_me_maybe裡面。
然後看到可以控制Stack的有哪些,第一個是問名子的gets函數,第二個是可以讓你想寫哪就寫哪的Code。
第一個想法就是無腦在gets寫到Return address就結束了,但在這之前,我們先來看看有什麼樣的保護。
所以這個程式開了Canary和NX保護,感覺要無腦的塞到Return address應該是不行了,但還有另外一個可以寫入任意位置的地方,我們可以嘗試看一下程式逆向的狀態。
我們的目標在run_program這邊,run_program跑完應該會跳到0x80488b1準備跑say_goodbye,我們先進到run_program看一下Stack的狀態,在0ffffd04c的位置就放著Return address。
從程式碼中可以看出,arr在一開始,會先把0~9的位置全部放0來等待使用者的覆蓋。
這個時候看到Stack裡面,可以很明顯的看出0xffffd010之後連續放了10個0,這也表示從0xffffd010到0xffffd03c中間都是存放arr的值,那這個時候就比較好記算了,0xffffd03c的位置是arr溢出的第一個空間,0xffffd040是第二個,0xffffd044是第三個,0xffffd048是第四個,再來就是放Return address的0xffffd04c了,所以我們要覆蓋掉Return address的話,arr的Index就要輸入9+5=14的位置,而我們放的值就是程式之後的Return address,因此選項如果選Index 14然後放call_me_maybe的Function address就結束了。
除此之外也有很多方法可以得知為14,比如直接看arr定義的Code,從Code裡面可以知道EAX一開始被歸0,然後EAX被放在EBP-0x40的地方,而從下方的ADD和CMP比較是否為9來看,可以得知EBP-0x40就是程式碼當中的i,再繼續往下看會看道友一個EBP+EAX*4-0x34的地方放置著0,從CMP如果不等於9就跳回run_program+26然後將0放進EBP+EAX*4-0x34的空間來看,可以推出EBP+EAX*4-0x34是arr空間裡面的值,這個時候也可以推斷出Return address的位置。
先預設程式剛進入run_program,這個時候EAX為0,套上公式EBP+0*4-0x34,也就是EBP-0x34的地方放著arr的第一個空間,而下一個空間是EBP+4-0x34的位置,等同每個arr的空間有4個Bytes可以放,這個時候我們就知道,EBP的位置在0x34/4=13的地方,那第14個就是Return address擺放的位置了。
我們來驗證看看,輸入10個1到Index 14上面,1111111111在16進位裡面是423A35C7,那在0xffffd04c上也是放著423A35C7。
最後,我們用最快速的方式跳過去,甚至不需要用到pwntools,已知call_me_maybe的Function address為0x80485fb,換算成10進位是134514171,那直接將程式執行起來,然後在Index的地方輸入14,值輸入134514171,然後讓run_program程式結束,轉跳到call_me_maybe。
這樣一來我們就拿到Flag了!