一、通用過程
- 通過file指令查看二進制文件是32位還是64位,這個影響特別大(涉及參數的傳遞方式)
- 通過checksec指令查看可執行文件的保護措施開啓情況
- 運行一下這個可執行文件,瞭解一些程序運行流程
- 開始通過pwntools解題
指令速查
- ropper -f [文件名] --search [“指令”]
- ropper -f pwn-2 --search “pop rdi; ret”
(注意rdi後面的分號和空格)
- ropper -f pwn-2 --search “pop rdi; ret”
- …
二、緩衝區溢出攻擊
- 尋找可以進行攻擊的位置
- 通過cyclic [number] 獲得一個長度爲number的序列
- 在攻擊處輸入上一步獲得的序列,查看報錯信息
- 通過cyclic -l [序列] 來判斷從第幾位開始覆蓋的是返回地址
- 構造payload
- 構造payload時請注意是32位程序還是64位程序,對於32位程序,傳遞參數可以通過棧溢出來直接修改參數信息,對於64位程序,可能需要利用GOT技術。
- 第2~4步也可略過,改爲根據源代碼進行推算,但是這樣比較繁瑣,而且容易出錯。
- gdb會提示報錯信息,但是請注意它是小端存儲還是大端存儲,比如它提示0x61616167時,對應的不一定是aaag,在小端存儲下對應的其實是gaaa.
- 請注意,並不是只有gets這種不限制長度的字符串讀取才是緩衝區溢出的信號,對於不限制長度的strcpy也可能導致緩衝區溢出。
三、整型溢出攻擊
- 一般如果涉及對字符串長度的判斷,可能就是這一類題型,但往往不會作爲單獨的考點出現,一般會結合其他考點,比如整型溢出+緩衝區溢出。
- 解題方法也很簡單,利用整型溢出即可。主要是找到能夠攻擊的位置。