Author: 堇姬Naup
觀察一下會發現 main_read 其實會將輸入存到 rbp-0x10,可以利用這個特性來寫入 ROP chain
leave
然後有一塊可以寫ROP的地方buf1
這裡我們構造
第一次跑的時候,會在底下先遇到一個leave
stack rbp指的地方會從
變成
這時候ret會跳回main read
我們輸入gadget 1 、 gadget 2 、 buf2 、 main read(因為read會把東西存到rbp-0x10)
這時候read完會碰到leave,rsp會先指到rbp一樣的位置,然後pop rbp,rsp指到*buf1 + 0x8
,而rbp指到*buf2
再來ret,會ret到main read
寫到rbp-0x10,但我們目標都寫在buf1,所以這輪不寫,直接填充a
main read完leave,rsp指到rbp,rbp拿最上面的拿到buf1 + 0x10,指過去
再來ret到main read,寫入資料rbp-0x10(寫入gadget 3、gadget 4、buf2、main read)
遇到leave,rsp會先指到rbp一樣的位置,然後pop rbp
之後ret到main ,輸入aaaa(padding 16 bytes),之後 buf1 - 0x18 ,leave
先遇到一次leave,rsp會先指到rbp一樣的位置,然後pop rbp
ret到leave,再做一次leave,rsp會先指到rbp一樣的位置,然後pop rbp,
之後ret開始執行gadget,這樣就成功寫入gadget並執行了