1. 程式人生 > >Linux下緩衝區溢位攻擊及Shellcode

Linux下緩衝區溢位攻擊及Shellcode

4.3.2 Linux32環境下函式的返回地址

編譯、連結、執行程式buffer_overflow.c,並關閉Linux的棧保護機制,參見截圖:


下面用gdb除錯程式:

在foo函式的入口、呼叫strcpy函式處和foo返回處設定斷點:

 

繼續執行,找到函式的返回地址:

buff的起始地址B到儲存函式的返回地址A之間的偏移:

A-B=0xbffff29c-0xbffff280=0x1c=16+12=28

因此,如果Lbuffer的長度超過28位元組,將會發生緩衝區溢位,Lbuffer中偏移28的4個位元組“ABCD”將覆蓋地址為0xbffff29c記憶體單元的值,即foo的返回地址變為“ABCD”(0x44434241)。


由於0x44434241不可訪問,因此出現斷錯誤。

4.3.3 Linux32環境下的Shellcode編寫

編譯、連結、執行shell_asm_fix_opcode.c,可以通過緩衝區溢位獲得shell,參見下圖:


4.4做實驗並寫實驗報告

沒有修改檔案前:

為了找出發生溢位的原因,用gdb除錯:

由於lvictim沒有發生溢位,所以為了除錯方便,我把老師的原始碼buffer[512]改成了buffer[500],如圖:


重新編譯執行,發生段錯誤:


下面開始用gdb除錯,找出smash_largebuf函式的返回地址所在的記憶體單元與緩衝區起始地址的距離。

先反編譯smash_largebuf函式:



然後設定三個斷點:


下面啟動程序,得到函式的返回地址0xbffff35c:


繼續執行到下一個斷點,buff的開始地址在0xbffff158,存放在0xbfffed30中:


所以:

0xbffff35c-0xbffff158=0x204=516

OFF_SET=516

BUFFER_ADDRESS有一個範圍,可以從0xbffff158開始設定

程式中需要改動的地方如下:


下面開始演示攻擊lvictim,並獲得shell,要注意關閉地址隨機化:


可以看到,已經獲得了shell,實驗成功了。