基於緩衝區溢位的HelloWorld

2022-09-09 13:33:35 字數 3653 閱讀 8725

#include "stdafx.h"

void helloworld()

void fun() ;

arr[6] = (int)helloworld;

}int main(int argc, char* ar**)

**並沒有呼叫helloworld,但成功執行了helloworld

很容易看出arr[6] = (int)helloworld;這行**有問題,將乙個函式名強轉為int型,並賦值給arr[6],而arr[6]已經超出陣列大小

main()反彙編

main:

00410790 push ebp

00410791 mov ebp,esp

00410793 sub esp,40h

00410796 push ebx

00410797 push esi

00410798 push edi

00410799 lea edi,[ebp-40h]

0041079c mov ecx,10h

004107a1 mov eax,0cccccccch

004107a6 rep stos dword ptr [edi]

004107a8 call @ilt+15(fun) (00401014)

004107ad xor eax,eax

004107af pop edi

004107b0 pop esi

004107b1 pop ebx

004107b2 add esp,40h

004107b5 cmp ebp,esp

004107b7 call __chkesp (00401140)

004107bc mov esp,ebp

004107be pop ebp

004107bf ret

call跟進

00401014   jmp         fun (00410740)

00401019 jmp helloworld (004106c0)

fun()反彙編

fun:

00410740 push ebp

00410741 mov ebp,esp

00410743 sub esp,54h

00410746 push ebx

00410747 push esi

00410748 push edi

00410749 lea edi,[ebp-54h]

0041074c mov ecx,15h

00410751 mov eax,0cccccccch

00410756 rep stos dword ptr [edi]

00410758 mov dword ptr [ebp-14h],1

0041075f mov dword ptr [ebp-10h],2

00410766 mov dword ptr [ebp-0ch],3

0041076d mov dword ptr [ebp-8],4

00410774 mov dword ptr [ebp-4],5

0041077b mov dword ptr [ebp+4],offset @ilt+20(helloworld) (00401019)

00410782 pop edi

00410783 pop esi

00410784 pop ebx

00410785 mov esp,ebp

00410787 pop ebp

00410788 ret

初始狀態

堆疊圖:

call指令執行後

堆疊圖:

jmp跳轉後,到設定緩衝區後的狀態

這裡要注意[ebp+4],此時為004107ad為函式的返回位址

堆疊圖:

區域性變數設定

int arr[5] = ;這行**,編譯器會劃分出5int寬度的記憶體空間存放,根據下標由小到大,記憶體位址由低到高。

要分配5int大小的空間,所以從ebp-0x4*0x5ebp-0x14開始分配

區域性變數設定完成後的堆疊圖:

執行arr[6] = (int)helloworld;發生了生麼?

004110b8   call        @ilt+20(helloworld) (00401019)

緩衝區溢位

緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...

緩衝區溢位

緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...

基於棧式的緩衝區溢位

緩衝區溢位攻擊是乙個老生常談的問題了,實際上我們所在的這個世界上,每天無時無刻不在發生各種各樣的緩衝區溢位的攻擊,隨著反制技術的不斷公升級,這些攻擊技巧都在大量進行公升級還貸,但,所謂 有壓迫 就有反抗!aslr 位址隨機化 dep 資料執行保護 ascii armoring 位址插零 gs 呼叫 ...