這道題的基本思路參照了KMFL師傅的部落格~~~原文連結如下:
原文連結:https://blog.csdn.net/weixin_44145820/article/details/105482269
這裡只記錄一下整個漏洞利用的第一步也就是利用格式化字串漏洞洩露Libc地址和程式碼段地址。
首先gdb,一直除錯到
然後除錯的時候隨便輸入一個內容就好,
然後繼續走, 到產生漏洞的地方,ida中的這行程式碼:
在gdb中:
此時暫存器為:
而棧中的資料是:
圖中第一個箭頭指向了程式碼段 main+28 的位置,而第二個箭頭指向了libc中 __libc_start_main+240 中的位置,
所以通過這兩個值就能洩漏出程式碼段的地址和libc_base。
查一下偏移,64位中還有6個暫存器進行傳參,所以相對於輸入的第一個箭頭指向的位置相對於輸入的內容在偏移為11的地方,
同理第二個箭頭指向的位置在偏移為15的地方。
所以利用格式化字串,當我們輸入的
時,就會洩漏這兩個值,接收後再分別減去在ida中
main+28位置的地址即0x1186和 -240-libc.symbols['__libc_start_main'] 得到兩個基址,通過這兩個基址可分別計算
存放申請堆塊地址的note的位置,以進行接下來的unlink,然後洩漏libc基址的重要性就不多說啦~
最後一句話給自己長記性:除錯格式化字串的時候別在剛輸入的時候就斷,一定得在產生漏洞的printf(&format)處斷,這個錯誤思想折磨我好久了。。。
初學pwn,有什麼錯誤歡迎各位師傅指正。
--by:newf1rst