在上一篇中,我們提到有數種方法可以改變這個程式的執行路徑:
gdb
改掉 eip
eip
蓋掉print_flag
(如果 flag 有寫在程式內的話)由於 1 很明顯不能做,故我們可以試著用 2 的方法來做。
前一篇當中有提到可以用 info functions
來找到我們要的函式的位置,其位置為 0x0804854b
。
其實也有另一種方法,可以拿到此數值:
readelf -a ./pwn2
在上一篇當中,我們也有看到 echo
函式的內容:
程式的執行路徑大概是這樣:
ebp - 0xef
推到 eax
eax
推到 stack 上eax
指的位置一個函式在 ret
時 (x86),會把 stack 上的數值 pop 出來,並寫到 eip
暫存器上。此時下一步將會跑去 eip
所指的位置來執行程式。我們若在第三步時,讓 gets
蓋掉在 stack 上的 eip
,就可以影響 echo
函式返回時會呼叫的函式。
由於我們可以知道 gets
的目標是 ebp - 0xef
,而我們的 eip
會在 ebp
附近,故可以推算出要送多少長度的字出去。
--------stack 頂端------- (esp)
本地變數
...
(ebp - 0xef)
...
...
存在 stack 上的 ebp (0xef, EBP 位置指向此處)
存在 stack 上的 eip
---main 的 stack frame --
...
我們來試著計算長度。
int(0xef) = 239
int(0x4) = 4
239 + 4 = 243
因為要計入 ebp 的長度,故要加上 4 byte。