基於棧式的緩衝區溢位

2021-08-25 14:32:29 字數 2620 閱讀 5393

緩衝區溢位攻擊是乙個老生常談的問題了,實際上我們所在的這個世界上,每天無時無刻不在發生各種各樣的緩衝區溢位的攻擊,隨著反制技術的不斷公升級,這些攻擊技巧都在大量進行公升級還貸,但,所謂**有壓迫**就有反抗!

aslr(位址隨機化)、dep(資料執行保護)、ascii armoring(位址插零),gs(呼叫 cookie)等方面的反制技術讓攻擊變的越來越困難,當人類被壓迫的時候會想出各式各樣的方法來解決這些問題,只是變得困難了但不是說不能進行攻擊,例:dep 保護  「rop_chains、ret2libc」 可以繞過它們,gs 呼叫 cookie 保護,有兩類方式繞過,一靠猜【蒙】函式的呼叫 cookie 值(這是乙個固定的值)另一種是想辦法利用溢位強行覆蓋 「seh(結構化異常處理)catch_chains」 中的虛函式處理位址

ascii armoring 保護;就是想辦法讓每個被引導程式位址空間的 libc 函式的位址中都具有乙個 null 位元組,從而讓通過字串拷貝的 libc 的位址無效,讓攻擊無從談起,但人們的智慧型是無窮的,當遇到了壓迫人們就會奮起的進行反抗,所以 ret2plt 技術應用而生,它利用 ppr(pop %ebx pop %ebp retn)指令序組成一段連續的 strcpy or memcpy 函式把要被呼叫的函式位址的位元組從不同的空間拷貝到棧上,然後在進行呼叫,從而繞過 「ascii armoring」 的保護機制。

上面提到這些攻擊技術幾乎都是利用棧溢位攻擊的,那麼堆溢位是不是就真的安全?顯然不是的,堆溢位攻擊(unlink)相信很多人可能沒有聽過這個東西,這是一種專門 「堆溢位攻擊」 提出的一門技術,它就是想辦法利用目標程式的 「堆溢位」 的漏洞,把分配的 「堆記憶體」 的 「chunk header」 中的虛函式位址給覆蓋了,malloc 分配的記憶體是連續的,即 malloc 兩次記憶體之間的位址是相互連線在一起的(從高到低,跟棧差不多)而 「堆溢位」 就是想辦法覆蓋掉 「下個 malloc」 函式分配的 「chunk header」 中的 free addr 當 「程式」 呼叫第二次 free 函式時就會執行攻擊的 shellcode。

所以沒有真正安全程式與技術,它只是相對的,但這對我們來說有多大的意義?我本人在這裡不說推銷這些技術,而是首先我們需要明白一點,技術本身是無罪的,犯罪的只是別有用心的人而已,大多數所謂進行不法活動的人都是些在某些 xx 群裡面交了點學費,拿了點資料跟工具就出來禍害人的 「小害蟲」,提供工具的人水平不用質疑,但是沒用到正道上面!

我們了解與研究這些技術,並不一定需要真的就去 「專精」 它們,因為我們想要沐浴在 「陽光之下」,不過這個也需要看每個人的選擇,或許它們覺得這很 geek ,當然走 ia / ma / sa 也很 geek,只是大多數人不知道而已,它們之間只是發展方向上的不同而已,大多數做安全更多還是去搞 「競品分析」,地位也不能和 2010 年之前相比了。

我個體只想走 「陽光正道」,不喜歡走這些東西,而且我的確從打心底來說,並不是那種特別喜歡這些東西的人,但我還是要了解與研究它們?原因是為了更好的防護的我的 「程式」 當我不知道它們的攻擊手法,你不可能在軟體在做 「瀑布設計」 與 「敏捷開發」 過程中兼顧並考慮到這些問題,那麼又從何去解決問題減少損失?坐等 「防毒流氓、微軟」 這些去打補丁?或者說不用考慮的直接關閉我的程式或伺服器?但當我們知曉了我自然有更好的辦法能夠解決這些問題,減少損失不是更好?

本文只提供 jmp esp 的方式,雖然這個方式在現代來說根本不能用,但是就了解緩衝區溢位攻擊是乙個很不錯的入門試驗,後面我可能會寫基於 rop_chains 或 ret2libc 攻擊的利用方式,但它們本質是想通的,只是變得更加的麻煩跟費神,但不是說不能應用,其實市面上還有很多可以通過這幾類方法利用的漏洞,你不得不說大多數人包括公司的安全意識真的太差勁了。

但是要執行本文給出的**,你必須要在 c/c++ 編譯器與聯結器配置中關閉掉 「gs」 與 「dep」,dep主要是為了防止 「不具有 page_execute_read 」 記憶體標誌,許可權的二進位制**資料的執行,而 jmp esp 是把 shellcode 複製到棧上執行的,而棧上的記憶體是不具有 「page_execute_read」 的許可權的,只有 page_readwrite 的許可權,不過這個問題可以利用 rop_chains 進行繞過。

參考上述要進行試驗的 c/c++ 配置,說實話這個東西,如果靠給人講其實並不是形象(有點抽象)或許說了很多其實到最後面人們可能還是沒有理解,所以本文將提供可被編譯且正確執行的 「c語言示意**」 用於闡述本文的內容。

#include

#include

static unsigned char shellcode = 

;static void fun_hijacked()

static void fun_bug()

static void fun_def_jmp_esp()

}static void* fun_get_jmp_esp_addr()

p++;}}

int main(int argc, char* argv)

緩衝區溢位 棧溢位

1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...

緩衝區溢位 棧

正義與 共存,推動正義的進步,正義迫使 的昇華,兩者誰是誰非。是非只是它人的定義,兩者都是正確的 在我們除錯程式的時候,我們如何去掉除錯視窗中的cccc 的內容。第一步 開啟專案屬性 c c 生成 基本執行時檢查設定為 未初始化的變數 安全檢查 否 第二步 開啟專案屬性 聯結器 高階 隨機基址為 否...

Kali 棧緩衝區溢位

堆疊記憶體是執行時實時分配的 與棧溢位有關的暫存器主要是esp,ebp,eip。esp和ebp都是用於控制當前執行函式棧幀的暫存器。ebp指向棧幀最高記憶體位址,esp指向棧幀最低記憶體位址。棧幀 棧幀中存放著函式的引數,區域性變數,及恢復前乙個棧幀所需要的資料。一旦函式執行完畢,整個棧幀就會被復原...