題目來源:Jarvis OJ
題目名稱:Level0
題目介紹:
屬於棧溢位中的ret2text 意思是Return to text 當程式中有可利用的危險函式 控制程式的返回地址到原本的函式 實現溢位利用
基礎過程(看個人習慣):
執行程式 檢視程式流程
file 檢視檔案記憶體型別
checksec 檢視檔案保護機制
ida 反編譯程式
分析可疑漏洞點 確定攻擊思路 編寫poc
檢視程式執行流程
不同的系統,記憶體的構造不同,堆疊相關的暫存器操作主要是EBP和ESP暫存器,比作指標來說,ESP暫存器總是指向堆疊的棧頂,當執行PUSH命令向堆疊壓入資料的時候,ESP減4,然後把資料複製到ESP指向的位置,執行POP命令的時候,首先把ESP指向的資料複製到記憶體/暫存器中,然後ESP+4,而堆疊在記憶體中的地址從高向低擴充套件,因此引數或者區域性的變數總是透過EBP加減一定的偏移地址來訪問的。
32位 4偏移量
64位 8偏移量
棧溢位漏洞,通常需要確定填充長度,計算要操作的地址和覆蓋地址的距離,棧基和棧頂的位置,透過上述的偏移量計算獲得,根據現實情況去覆蓋特定的變數或者地址內容。
得知是64位檔案
檢視檔案保護機制
NX堆疊禁止執行
PIE位置無關可執行檔案
Canary堆疊溢位哨兵
Symbol符號
RELRO(got防寫)全域性偏移表動態解析函式 地址隨機化
只開啟了一個NX,沒有開啟Stack Canary,這個功能在函式執行前先在函式呼叫位置插入cookie標記,當函式返回撥用的時候驗證cookie資訊是否合法,不合法就停止程式執行,但是如果溢位中,也覆蓋了cookie,就會繞過。PIE意為地址無關的可執行檔案,每次載入程式的時候都變換text、 data、bss 等段的載入基地址,使得攻擊者難以定位相應的基地址執行溢位。
扔到ida看一下 直接進入min函式反彙編 發現會列印helloword後返回了一個函式
檢視這個函式 rbp-80h //該字串距離ebp的長度為 0x80h
ebp
基址指標暫存器 指向系統棧最上面一個棧幀的底部(堆疊定址)
主要作用是儲存恢復堆疊 以便於傳遞引數給函式
read函式沒有做過濾,會讀取其中的內容直到回車。
該檔案是64位的 距離ebp的長度為0x80 距離esp那就有0x8b
64位的情況下為8byte
pop ebp;出棧 棧擴大4byte
push ebp;出棧,棧減少4byte
那麼相應的棧結構為(圖是網上偷的)
發現這裡有一個callsystem 內建系統函式system('/bin/sh')執行系統命令
地址0x400684 加上這個地址覆蓋為我們想要返回讀取的地址
payload = 'a'*0x80 + 'b'*8 + p64(0x400596)
此時的棧結構是
在把這一串字串傳送到程式內 計算機的記憶體中每個值都是按照位元組儲存的 一般情況下都是小端儲存
什麼是小端儲存:
在小端儲存模式下 資料的最低有效位元組會被儲存在資料的最低地址處,最高有效位元組反之。
既0x0804843B 在記憶體中的形式是 \x3b\x84\x04\x08
使用pwntools把位元組作為字元傳遞進去,也就是把字串轉換為二進位制。
from pwn import * import pwn r = pwn.remote('pwn2.jarvisoj.com', 9881) # buf rbp callsystem payload = 'a'*0x80 + 'b'*8 + p64(0x400596) r.sendline(payload) r.interactive()