前言向乙個緩衝區中放置比分配的空間還多的資料就可能導致緩衝區溢位,正常的緩衝區溢位條件會導致段越界發生,利用這種情況可以達到訪問目標系統的目的。(由於作業系統都預設啟動了一些安全機制,傳統的緩衝區溢位攻擊已經不在管用了)1.學習緩衝區溢位攻擊需要有c語言和彙編的基礎,以及一些作業系統知識
2.我是個菜雞,文章是邊查資料邊寫的,如發現文中有錯誤,很大可能就是寫錯了
4.緩衝區溢位涉及到許多技術,請不斷深入學習
緩衝區溢位的主要原因在於忽視了對輸入資料的校驗。
緩衝區:用於訪問資料的記憶體,位置和長度在編譯時確定或在程式執行時動態分配。棧和堆都是快取區。
緩衝區溢位攻擊:緩衝區溢位時,如果鄰近的記憶體被程序使用,則可能導致程序不正確執行,如果被覆蓋的是函式的返回位址(call必須記住呼叫時當前的位址,所以需要先將返回位址push到棧中,一般函式呼叫的返回位址就在緩衝區後的高位址處),攻擊者可以通過構造溢位的資料來改變原程式的執行流程,控制程序的執行流程。
shellcode:用於利用軟體漏洞而執行的**。是一段16進製制的機器碼。一般的功能就是提權。
linux關閉/開啟位址隨機化機制
sudo sysctl -w kernel.randomize_va_space=0
目前randomize_va_space
的值有三種,分別是[0,1,2](預設為2)
0 - 表示關閉程序位址空間隨機化。(禁用)
1 - 表示將棧(stack)隨機化。(除堆以外隨機化)
2 - 表示在1的基礎上增加堆(heap)的隨機化。(全部隨機化)
程序映像:程序在記憶體中的分布。(了解程序映像是攻擊的基礎)
linux程序映像
32位與64位相似,只是大小不同
|**(位址按源**執行順序從低到高排列) | 低位址
—————————————————————————————————————————
| 已初始化的全域性變數 |
—————————————————————————————————————————
| 未初始化的全域性變數 |
—————————————————————————————————————————
| 動態記憶體(堆結構) |
—————————————————————————————————————————
| 空閒 |
—————————————————————————————————————————
| 區域性變數(棧結構) |
—————————————————————————————————————————
| 環境變數 | 高位址
windows程序映像
結構與linux大體一致,區別有:
1.區域性變數位於堆疊的低位址區。
2.字串變數先定義,**棧,存放在低位址。
簡寫:——————————————————————————————
| **段、資料段 |
——————————————————————————————
| 堆疊區 | 低位址
補充:win7使用位址隨機化機制,程序的位址空間每次執行皆不同,動態鏈結庫的載入基址不隨程序位址變化而變化,重啟作業系統,動態鏈結庫的載入基址變化。(不同版本的系統動態鏈結庫及其載入基址不同)。
gcc棧檢查
開啟棧檢查(預設開啟):使用gcc編譯時加入-fstack-protector
選項。
關閉棧檢查:使用gcc編譯時加入-fno-stack-protector
選項。
遠端攻擊:相比於本地攻擊的唯一區別是攻擊**從網路傳遞(資料報),然後複製到緩衝區。
exec-shield:通過限制記憶體空間的讀寫和執行許可權(除存放可執行**的記憶體空間以外,對其餘記憶體空間盡量禁止執行)來防禦攻擊的機制。由於通常情況下不會在棧空間裡存放可執行**,所以將棧空間的許可權設為可讀寫且不可執行。
morris蠕蟲:fingerd
的緩衝區溢位漏洞
1.分析除錯:(是否存在漏洞?如何利用?)
方法:在關鍵點設定斷點
(1)記錄函式的返回位址(第一條語句中esp的值,會動態變化),返回位址都是存放在被呼叫函式的棧幀中。
把位址看成字串,跳轉位址的最高兩位元組為』\0』。
(3)檢視esp,確定被修改的返回位址(ret語句中)。
補充:放置shellcode的條件(放置位置需要實際除錯確定)
(1)若緩衝區較大,可以容納shellcode(linux64位系統緩衝區溢位攻擊的前提),將shellcode放置在跳轉位址(函式返回)之前。
(2)若緩衝區不足以容納shellcode,將shellcode放置在跳轉位址之後。
(3)如系統未開啟位址隨機化,對於本地溢位,可以把shellcode放在環境變數裡(環境變數的空間很大,足以容納shellcode),優勢是位址定位準確。
(4)程序跳轉攻擊
2.編寫shellcode
(1)寫出簡潔、能完成所需功能的**。
(2)反編彙得到的可執行**,用組合語言實現相同的功能。
注意:a.不同系統中彙編語法不同:
linux: mov src, dest
win32 : mov dest, src
b.避免shellcode中的\x00:
編寫沒有機器碼\x00的指令(比如用兩個一樣的值xor來代替0x00)
將shellcode編碼,新shellcode=解碼程式+編碼的原shellcode
c.在linux系統中,系統呼叫的編號定義於/usr/src/linux/include/asm/unistd.h
。
(3)提取操作碼,寫成shellcode,並驗證。
3.攻擊(比如以root許可權啟動/bin/sh)
與linux差不多。
程序跳轉攻擊:尋找動態鏈結庫的對映區中的call esp
和jmp esp
指令,該位址是攻擊的跳轉位址,將該位址覆蓋函式的返回位址,將shellcode放在返回位址所在單元後,使溢位後通過動態鏈結庫的對映區中的call esp
和jmp esp
指令跳到shellcode。
通常用系統呼叫和較為基礎的win api實現,shellcode中呼叫api比較麻煩,偷個懶 :·)
比如printf類函式的字串格式化bug。
1.按照安全規範程式設計,使用安全函式,對輸入資料做邊界檢查,並進行測試。
2.使用堆疊保護,即使發生緩衝區溢位,僅會破壞記憶體資料,不會執行惡意**。
3.禁止堆疊執行,阻止程序被劫持。
《網路資訊保安》 曾凡平著 7~11章(我開始就是看它學的,有典型的例項,可以都做一下)
《有趣的二進位制:軟體安全與逆向分析》 第3章(有典型的例項)
關閉linux 記憶體位址隨機化機制
對抗棧幀位址隨機化/aslr的兩種思路和一些技巧
windows堆位址隨機化原理剖析與改進
緩衝區溢位攻擊
[轉]緩衝區溢位攻擊(含示例)
利用gcc自帶的功能-fstack-protector檢測棧溢位及其實現
gcc 中的編譯器堆疊保護技術
緩衝區溢位攻擊試驗(bufbomb c)
本文的 來自 於 computer systems a programmer s perspective 深入理解計算機系統 一書中的bufbomb.c作業題。實驗環境xp vc6.0。另 linux2.6 gcc4.x下目前碰到棧保護等措施,暫時還沒研究出結果。問題描述如下 分析下面程式,可以得知...
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...