MFCTF / AIS3 pre-exam 2021 – write me

這題在 MFCTF 最後一刻才解出來,結果拿到 flag 要交時已經關了


題目提供了 source code 與程式本身

跑一下程式

恩….掛個 gdb 看看

看起來像是寫入錯誤的地址了
檢查一下程式的 flag

PIE 是沒開的,所以應該可以直接拿找到的地址來用
隨便拿個 stack 的值填看看

這邊用 0x7fffffffda80 來用,換成 int 是 140737488345728

可以看到 error 變了,發生 RIP 指向 0x0 的狀況

慢慢追的話會發現是在 call system 的那行掛掉的

仔細看 source code 的話會發現前面有兩行

void *systemgot = 0x404028;
*(long long *)systemgot = (long long)0x0;Code language: JavaScript (javascript)

看起來是將指向 system 的值消掉了
這邊就從簡,在 source code 中加個一行 printf(“%x”,*(long long *)systemgot);
並用 gcc gotplt.c -o test -no-pie 編譯

可以拿到原本的值
所以地址是 0x404028, 值是 0x401050

部落格之前有一篇有提到 GOT 表的概念,這邊的原解法應該也是用類似的方法找 GOT 值
但有點懶的再那樣追