linux溢出總結+windows aslr地址隨機化繞過

來源:互聯網
上載者:User

標籤:

實驗一 Linux下緩衝區溢位
通過緩衝區溢位漏洞執行自己的代碼
【實驗代碼】

【實驗目的】
通過緩衝區溢位,使其執行not_called函數。
【實驗原理及結果】
(1)編譯器(關閉掉棧保護):

(2)gdb偵錯工具
查看vulnerable_function函數彙編代碼

我們可以看到該函數開闢了一個0x6c大小的緩衝區
| argument |
| return address |
| old %ebp> | <= %ebp
| 0x6c bytes of |
| … |
| buffer> |
| argument |
| address of buffer> | <= %esp
因此構造的buffer如下所示:
| not_called>的地址 |
| BBBB |
| 0x41414141 … |
| … (0x6c bytes of ‘A’s) |
| … 0x41414141 |
查看not_called函數的地址

因此,如下所示:
我們構造的緩衝區結構如下:
“A”*0x6c + “BBBB” + “\x44\x84\x04\x08”

緩衝區溢位漏洞改進版(1)
【實驗代碼】
實驗代碼同上
【實驗目的】
第一次實驗是通過緩衝區溢位執行自己的其他代碼,這次主要是通過緩衝區溢位執行system函數,例如執行system(“/bin/sh”);
【實驗原理及結果】
執行system函數,很明顯要找到函數system以及字串”/bin/sh”
(1) 找到system函數,函數地址如下所示:0x8048360

(2) 找到字串/bin/sh
首先在main函數入口處設斷點


找到system的地址

根據system找到字串”/bin/sh”的地址

(3) 構造buffer
| 0x40197fb8 “/bin/sh” |
| 0x43434343 fake return address> |
| 0x8048360 address of [email protected]> |
| 0x42424242 fake old %ebp> |
| 0x41414141 … |
| … (0x6c bytes of ‘A’s) |
| … 0x41414141 |

【運行結果】

緩衝區溢位漏洞(方法2)—利用pop-pop-return指令
【原理分析】
在這裡我們使用pop-pop-return指令來執行代碼
棧構造的格式如下:
| address of mov %eax, (%ecx)> |
| value to write> |
| address to write to> |
| address of pop %ecx; pop %eax; ret> |
【實驗代碼】

【實驗目的】
本次實驗的目的是先去call add_bin函數然後call add_sh函數,最後call exec_string函數
當我們call add_bin函數時,棧的結構如下:
| argument> |
| return address> |
首先我們要先構造參數0xdeadbeef返回地址是pop;ret。這樣的話,函數就會從棧中彈出oxdeadbeef然後返回到下一個地址中。
| 0xdeadbeef |
| address of pop; ret> |
| address of add_bin> |
Add_sh函數需要兩個參數,我們使用指令pop;pop;ret
| 0x0badf00d |
| 0xcafebabe |
| address of pop; pop; ret> |
| address of add_sh> |
因此我們總體構造的棧的結構是:
| address of exec_string> |
| 0x0badf00d |
| 0xcafebabe |
| address of pop; pop; ret> |
| address of add_sh> |
| 0xdeadbeef |
| address of pop; ret> |
| address of add_bin> |
| 0x42424242 (fake saved %ebp) |
| 0x41414141 … |
| … (0x6c bytes of ‘A’s) |
| … 0x41414141 |
【實驗步驟】
1.查看pop;ret pop;pop;ret 以及三個函數的地址
Pop;ret的地址0x80484b7
Pop;pop;ret的地址為0x80484b6
函數add_bin:0x8048428
函數add_sh的地址0x804846e
函數exec_string的地址為0x8048414
(2)構造shellcode

實驗二windows緩衝區溢位繞過ASLR

【原理】

載入程式不再使用固定的基址載入,從而幹擾 shellcode 定位的一種保護機制
在 VS 2008 中啟用裡連結/dynmicbase 連結選項可以開啟 ASLR 保護,為 vs 中 ASLR 的編 譯選項:


ASLR 保護措施:
1. 映像隨機化:
在 可攜式執行檔映射到記憶體中時,對其載入的虛擬位址進行隨機化處理,這個地址在系統啟動 時確定,系統重啟後這個地址會變化。但是雖然模組的載入基址變化了,但是各模組的進入點地址的低兩位是不變的,也就是說映像隨機化只是對載入基址的前兩個位元組做了隨機處理。兩次開機重啟之後 可攜式執行檔映射到記憶體中位置是不同的。

2.堆棧隨機化
每個線程的堆棧基址都做了隨機化處理,使得程式每次運行變數的地址都不相同。在程式運行時隨機的選擇堆棧的基址,與映像基址隨機化不同的是堆棧的基址不是在程式啟動 時候確定的,而是在開啟程式的時候確定的,也就是說在同一個程式任意兩次運行時的堆棧 基址都是不同的,進而各變數在記憶體中的位置也是不確定的。這種處理只能防止精準攻擊, 但是由於跳板指令的使用使得程式不需要精準跳轉,只需要跳到一個大概的位置即可。 ,第一次運行程式時堆棧的位置

兩次運行該代碼堆棧情況分別如下:


3.PEB 和 TEB 隨機化
編寫程式擷取當前進程的 TEB 和 PEB,TEB 存放在 FS:0 和 FS:[0x18]處,PEB 放在 TEB
運行了幾次,進程的 PEB,TEB 的地址沒有什麼變化,說明 ASLR 對 PEB(Process Environment Block,進程環境塊)和 TEB(Thread Environment Block,線程環境塊)的隨機化並不好。

【攻擊手段】

1.攻擊未啟用 ASLR 模組
在當前進程裡面找到一個使用 ASLR 的模組,利用它裡面的指令來做跳板,跳入到
shellcode 裡面即可。
2.利用 Heap apray 技術定位記憶體位址
通過申請大量的記憶體,佔領記憶體中的 0x0C0C0C0C 的位置,並在這些記憶體中放置 0x90 和

shellcode,最後控製程序轉入 0x C0C0 C0C0 執行,在函數執行返回執行後就會轉入我們申請 的記憶體空間中。
3.利用 Java applet heap spray 技術定位記憶體空間
4.用.NET 控制項禁用 ASLR
5.利用部分覆蓋進行定位記憶體位址 映像隨機化只是對映像載入基址的強兩個位元組做隨機化處理,我們可以選擇覆蓋這個地址的
最後一個位元組;此外,ASLR 只是隨機化了映像的載入基址,而沒有對指令序列進行隨機化,
也就是說指令的執行相對於基址的位置是相對不變的。
【利用部分覆蓋進行定位記憶體位址】

3.1 實驗環境

作業系統 Windows Vista SP0
DEP 狀態 Option
編譯器 Visual Studio 2008
最佳化選項 禁用最佳化選項
GS 選項 GS 關閉
DEP 選項 /NXCOMPAT.NO
Build 版本 Release 版本

3.2 實驗代碼

實驗思路和代碼的簡要解釋:
(1)為了直觀地反映繞過 ASLR 的過程,本次編譯的程式不啟用 GS
(2)編譯器禁用 DEP
(3)Test 函數中存在典型的溢出漏洞,通過複製超長字串可以覆蓋函數返回地址。
(4)複製結束後,test 函數返回 tt 字元數組的首地址
(5)我們找到跳板指令 call eax,用它地址的後兩個位元組覆蓋返回地址的後兩個位元組
3.3 實驗步驟
(1)先將 she llcode 設定為 2 62 個位元組的 0x90,並將 memcpy 函數中的複製長度設定為
262,用 od 載入,找到 call eax 對應的地址的後兩個位元組

(2)構造 shellcode
構造之後的 shellcode 代碼如下:

3.4 運行之後實驗結果:

【實驗分析】
(1)main 函數,棧中的變化圖所示:

發現 call eax 的地址的後兩位為 141C

(2)Call test 單步進入 test 函數:

在 test 函數中,是一個典型的緩衝區溢位的代碼,memcpy 將 26 2 位元組的 shellcode 複製到 了棧中,由於棧開闢了 256 個位元組的空間,這樣的話,就會發生緩衝區溢位,多出來的 6 個位元組就會淹沒掉 ebp 以及返回地址的最後兩個位元組,這兩個位元組裡面的內容如下。

很明顯函數的返回地址就是 call eax 的地址。

所以在函數返回的時候代碼會跳到 call eax 這條指令的地方,由於 eax 中存放的是 shellcode的首地址,這樣我們就轉到了 shellcode 裡面並執行惡意代碼,達到目的。
參考資料:
http://codearcana.com/posts/2013/05/28/introduction-to-return-oriented-programming-rop.html

linux溢出總結+windows aslr地址隨機化繞過

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.