今天來練習 ROP 的題目吧 但看起來似乎沒練習到呢
題目源自於 Bamboofox 某題題目,現存副本於 CTF-Wiki
為了方便練習就先看看 C code
#include <stdio.h>
#include <stdlib.h>
char *shell = "/bin/sh";
int main(void)
{
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
char buf[100];
printf("This time, no system() and NO SHELLCODE!!!\n");
printf("What do you plan to do?\n");
gets(buf);
return 0;
}
我們可以看到他使用了 gets 這個危險函數。
使用 checksec 可以看到開啟 NX(Non-Executable),意思是強制"可寫段不可執行,可執行段不可寫"的原則,代表我們無法直接寫 shellcode 然後執行,以及不能竄改可執行的區段。
從 main 可以看出 buf 的位置是 esp+0x1c,設置斷點後發現
EBP 是 0xffffd158,ESP 是 0xffffd0d0
所以 buf 的地址在 0xffffd0d0 + 0x1c = 0xffffd0ec,相對於 EBP 為 0xffffd158 - 0xffffd0ec = 0x6c(108),再加上儲存 EBP 的 4 bytes 可以得知我們要覆蓋的位置在相對於 buf 偏移 112 的位置。
然而由於這隻程式中有開啟 NX,所以我們不能隨意寫入 shellcode 執行,因此我們要透過 gadgets,至於怎麼利用就有空再寫吧~
Source:在圖片上
真的是甚麼奇怪的雜燴都有ㄟ