主要用的就是利用 leave;ret; 這樣的gadgets
假設,我們有一個程序,存在棧溢出漏洞,我們把內容覆蓋成了下面這樣子,當然此時 bss 段或者 data 段還沒有內容,待會會通過 read 函數輸入:
而實際上在程序調用完成 call 返回的時候,就會有這樣的 mov esp,ebp
pop ebp
ret
指令
當我們挨個去執行的時候會出現這樣的情況
首先是 mov esp,ebp
執行完以后變成了這個樣子:
然后 pop ebp
執行完后就是
別忘了,pop 指令是把棧頂的值彈到 指定的寄存器,也就是說 esp 會自動的減一個單位
這時候就到 ret
了,我們可以通過 read 函數來把內容輸入到 fake ebp1 的地址處
構造的內容主要是把fake ebp1 處寫成 fake ebp2 的地址
read 函數執行完成以后程序返回到了 leave_ret,這樣就會在執行一遍上面說的那樣
首先是 mov esp,ebp
執行完成后效果如下:
然后是 pop ebp
執行完成后:
此時在執行 ret
命令,他就會執行我們構造在 bss 段后者 data 段的那個函數