attacklab筆記

做完attacklab記點什麼,防止以後什麼都不記得了。

phase1-3用getbuf讀取字符串,但不檢測棧溢出,正常的gets()在返回前會call一個check函數,檢查棧溢出。

在lab裏通過棧溢出頂掉返回地址,把返回地址變成棧的地址,inject代碼到getbuf的棧裏或到上層的棧裏。在這個過程中明顯感受到代碼和棧和數據都是在一個地址空間裏。

phase4-5中增加了兩種防止棧溢出的機制:1.棧隨機化:每一次棧的地址都不一樣(在地址空間裏),沒有辦法把返回地址設置到棧上;2.把屬於棧的地址設爲不可執行的。

這樣使用叫做return-oriented programming (ROP)的機制進行攻擊。棧溢出把返回地址設置成原本代碼的地址,並進行截斷,生成想要的指令,並且馬上接ret,pc轉換爲下一個棧上的指令地址。這一小段代碼叫做gadget。這個過程中需要與彙編指令表相互對照,現有思路,再去找指令。

整個過程中還有兩點值得記錄:1.最開始遇到一個問題,設置返回地址後,不能繼續覆蓋棧上的值了,會出現segmentfault,只能把代碼放在當前的棧幀中。後來發現返回地址只設置成了四字節,後四字節是00000000,如果覆蓋掉了pc會指向無效地址。x86-64上地址都應該是8字節64位的。2.打出的代碼之類的要把這些字符轉換成二進制的信息,這些信息本身就是代碼,它們對應出的ascii不一定會是什麼,轉換後要把這些信息傳遞到程序中。

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