iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0

果然,做人不能亂立 Flag,直接不小心睡了十個小時,睡掉了凌晨 3 點的精華時光...

總之我再也不要規劃好隔天要講啥了...


昨天寫到了函式呼叫時必須要紀錄呼叫者的下一個 instruction,我們也實際用 gdb 看到的確有存入回傳地址。
但為了要實際利用漏洞達到 Pwn 的目的,我們必須要...要再快一點,喔錯了,我們必須要更了解記憶體配置。

所以我們一邊實際練習 buffer overflow,一邊觀察記憶體吧!

設計個題目如下:

#include <stdio.h>
#include <stdlib.h>

void game() {
    long val = 0xdeadbeef;
    char buf[4] = "abcd";

    printf("Input: ");
    scanf("%4s",&buf);

    printf("buf: %s\n",buf);
    printf("val: 0x%08x\n",val);

    if(val == 0xdeadbe00) {
        printf("GOOD!!\n");
    } else {
        printf("BAD!!\n");
    }
}

int main() {
    game();
    return 0;
}

可以看到如果要讓他 print 出 GOD 我們必須要將上面的變數改為 0xdeadbe00。

使用 gcc 編譯

gcc -g -m32 -fno-stack-protector lab.c -o lab

關於 gcc 的參數,因為我快來不及發文了,之後有空再寫。

上面的程式看起來好像沒問題,但仔細看看,我們的 buf 空間只有 4 bytes,但我們 scanf 的大小也設 4,但 C 語言中的字符串後面會有一個 '\n'(程式會轉成 null byte),因此這樣會造成他會往後 overflow 一個 byte,這種漏洞稱為 Off-by-one,是 overflow 的一種,現實世界中不好利用,但夠巧妙的話還是能造成 RCE。


我想好好打記憶體配置,但好像快沒時間了...所以痾...
實際示範一次:

┌──(kali㉿kali)
└─$ gcc -g -m32 -fno-stack-protector lab.c -o lab

┌──(kali㉿kali)
└─$ ./lab
Input: aaaa
buf: aaaa
val: 0xdeadbe00
GOOD!!

恩我們成功 print 出了 GOOD!!
為什麼這樣就能成功呢?
我明ㄊ... 嚇死差點忘了,我總有一天會寫的~ 謝謝大家


有人覺得不用介紹那麼詳細,而且快來不及了,我們快速介紹一下:

紅燒雜燴

(這看名字就知道是啥了,所以不放圖片了)
同樣看名字就知道是啥了,所以今天的介紹就到這邊~


上一篇
Day5 大雜燴之雜燴菜 - Pwn:Basic(3)
下一篇
Day7 大雜燴之十全大補湯 - 工控:攻擊
系列文
雜七雜八大雜燴,資安技術大亂鬥30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言