shiyanlou緩衝區溢位實驗
一、初始設定
1、Ubuntu 和其他一些 Linux 系統中,使用地址空間隨機化來隨機堆(heap)和棧(stack)的初始地址,這使得猜測準確的記憶體地址變得十分困難,而猜測記憶體地址是緩衝區溢位攻擊的關鍵。因此本次實驗中,我們使用以下命令關閉這一功能:
sudo sysctl -w kernel.randomize_va_space=0
2、此外,為了進一步防範緩衝區溢位攻擊及其它利用 shell 程式的攻擊,許多shell程式在被呼叫時自動放棄它們的特權。因此,即使你能欺騙一個 Set-UID 程式呼叫一個 shell,也不能在這個 shell 中保持 root 許可權,這個防護措施在/bin/bash
linux 系統中,/bin/sh
實際是指向/bin/bash
或/bin/dash
的一個符號連結。為了重現這一防護措施被實現之前的情形,我們使用另一個 shell 程式(zsh)代替/bin/bash
。下面的指令描述瞭如何設定 zsh 程式:
3、輸入命令linux32
進入32位linux環境
二、shellcode
在/tmp
目錄下新建一個stack.c
檔案:
通過程式碼可以知道,程式會讀取一個名為“badfile”的檔案,並將檔案內容裝入“buffer”。
編譯該程式,並設定 SET-UID。命令如下:
我們的目的是攻擊剛才的漏洞程式,並通過攻擊獲得root
許可權。
在/tmp
目錄下新建一個exploit.c
檔案,輸入如下內容:
現在我們要得到 shellcode 在記憶體中的地址,輸入命令進入 gdb 除錯:
gdb stack
disass main
esp 中就是 str 的起始地址,所以我們在地址0x080484ee
處設定斷點
接下來設定斷點:
最後獲得的這個0xffffcfb0
就是 str 的地址。
根據語句strcpy(buffer + 100,shellcode);
我們計算shellcode
的地址為0xffffcfb0
+0x64
=0xffffd014。
現在修改exploit.c
檔案,將\x??\x??\x??\x??
修改為計算的結果\x14\xd0\xff\xff。然後編譯expliot.c
先執行攻擊程式 exploit,再執行漏洞程式 stack,觀察結果
結果為實驗成功。