1. 程式人生 > 其它 >shiyanlou緩衝區溢位實驗

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,觀察結果

結果為實驗成功。