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,實驗成功了。
完