Day7-ret2code (ret2func)
Lab 網址 前言 經過了前一天的 lab,相信大家對於 buffer overflow 的原理已經有了更多的理解。既然我們能覆蓋判斷式中的值,那麼是否也能覆蓋 return address,讓程式跳到其他位置呢?這正是我們今天要介紹的攻擊技術:ret2code,又稱為 ret2func 或 ret2win。 介紹 回顧之前的 stack 內容,當使用 gets 讀取 buf 字串時,可以持續覆蓋記憶體,甚至可能覆蓋到 rbp 和 return address 例如,如果我們想跳到名為 shell 或 win 的函數,可以嘗試將 stack 覆蓋成如圖所示的狀態。當程式執行到 return address 時,它就會跳轉到我們覆蓋的位置。 雖然在現實情況下,程式中不太可能直接有開啟 shell 的 function,但在一些初學者的 CTF 題目中,這類控制程式執行流程(control flow)的題目仍然存在。在進入實作之前,我們要了解這種攻擊的前提條件是:需要關閉 PIE 保護,因為我們必須知道確切要跳轉的 function 位置。 Lab 查看以下程式原始碼: 1#include<stdio.h> 2 3void shell(){ 4 system("/bin/sh"); 5} 6 7int main(){ 8 setvbuf(stdout, 0, 2, 0); 9 setvbuf(stdin, 0, 2, 0); 10 setvbuf(stderr, 0, 2, 0); 11 char b[10]; 12 puts("Send me a message: "); 13 gets(b); 14 return 0; 15} 使用以下指令進行編譯: ...