緩沖區溢出簡單的來講分為兩種
- 棧溢出
- 堆溢出
那么什么是棧什么是堆呢
在這里簡單談一下對于堆和棧的理解 :
<p>棧: 用來為程序中已經聲明的變量來分配內存空間的地址,以及保存函數返回地址的空間,可以用來實現函數的遞歸調用。
例如 int ,char 這類的定義的數據。
<p>堆: 在程序運行時動態分配的內存。一般使用一個堆指針來使用得到的內存。堆在使用時需要實用專有的函數進行聲明。如C語言的malloc以及C++的new。注意使用完后要回收內存,否則會造成內存泄露。
例如 int *name;
name = (int *)malloc(8);
棧溢出
修改臨接變量(變量越界缺陷)
修改函數返回地址"自主控制":
定位工具:ollydbg.exe
相對地址選擇:kernel32.dll user32.dllS·E·H結構函數: 將異常處理函數入口地址更改為shellcode的地址。
堆溢出
堆的結構(堆區)
- 堆塊 :
- 塊首:8byte,用來存儲堆塊的信息
- 塊身: 用來存放數據(堆塊的指針是直接指向快身的)
- 堆表 :堆區的起始。 空閑堆塊的索引。
最重要的堆表有兩種:
空表(雙向鏈表)128項。
塊表(一般在緩沖區溢出中不予利用)
堆溢出的利用
- Dword Shoot:利用堆管理時“卸下”操作。
- Heap Spray:申請大量內存。slide code → shell code。