.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;資料段
.data
sztext db 'helloworldpe',0
sztext2 db 'overflow me!',0
szshellcode dd 0ffffffffh,0ddddddddh,0040103ah,0
;**段
.code
;---------------------------
; 未檢查長度的字串拷貝函式
;---------------------------
_memcopy proc _lpsrc
local @buf[4]:byte
pushad
mov al,1
mov esi,_lpsrc
lea edi,@buf
.while al!=0
mov al,byte ptr [esi]
mov byte ptr [edi],al
inc esi
inc edi
.endw
popad
ret_memcopy endp
start:
invoke _memcopy,addr szshellcode
invoke messagebox,null,offset sztext,null,mb_ok
invoke messagebox,null,offset sztext2,null,mb_ok
invoke exitprocess,null
end start
_memcopy函式的中,首先開闢了 local @buf[4]:byte 四個位元組的緩衝區,函式是要把位址lpsrc處的字串拷貝到這四個位元組的緩衝區,但其判斷字串結尾是採用識別'\0'來判斷的,並沒有採用長度限制,因此存在緩衝區溢位漏洞。
位址0x00401003處即是在棧ebp-4處開闢bu的f四位元組緩衝區,_memcopy函式要將szshellcode dd 0ffffffffh,0ddddddddh,0040103ah,0拷貝到此處。此時的棧資料如下圖所示,ebp-4處即為四位元組的buf緩衝區,拷貝szshellcode後ebp-4 ebp ebp+4處的值為0x0fffffff 0x0ddddddd 0x0040103a,另外一點就是ebp+4處存放的是函式返回後下乙個要執行**的位址(eip),原來值為0x0040102a,被覆蓋後的值變為0x0040103a,由最上面的od圖可以知道,本來顯示helloworldpe字串的messagebox此時變為overflow me!,說明**執行流程發生了改變。
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...
緩衝區溢位 棧溢位
1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...