竟然兩顆星的題目比一顆星的簡單!?
其實做到這裡發現逆向的題目也很有趣,Flag藏的方式非常多元,通常也會有很多種解決的方法,像是昨天的那題雖然只教了一種但還有其他地方可以切入
直接來看今天的題目吧
把檔案下載下來執行看看
今天用Ghidra這個工具,這是美國國安局NSA開發的開源工具,他的功能非常強大有興趣的可以自己研究一下ghidra
這邊先看看main,可以看到裡面有一個函數叫做do_magic應該就是要從這裡下手,這個工具有一個很強大的功能就是decompile,一般有這種功能的工具都是要付費的,點進do_magic後可以看到右邊的視窗有透過decompile的C code
這邊可以看到關鍵是在中間的while裡面,有一個字串greetingMessage要跟另一個字串做比較,若相等則計數器加一,加到19後跳出迴圈
再來看到greetingMessage與下列字串比對
(char)(__s[local_1c] ^ sekrutBuffer[local_1c])
__s這個陣列是我們輸入的字串,sekrutBuffer這個字串可以在Ghidra裡面找到
那我們要怎麼讓greetingMessage跟這個字串可以達成條件,也就是相等
這邊可以運用一個xor的特性
我們只要拿greetingMessage跟sekrutBuffer做xor就可以知道我們要輸入什麼字串了
這邊我寫了一個c的程式來做這件事
#include <stdio.h>
int main(){
char __s[25]={0x29,0x06,0x16,0x4f,0x2b,0x35,0x30,0x1e,0x51,0x1b,0x5b,0x14,0x4b,0x08,0x5d,0x2b,0x53,0x10,0x54,0x51,0x43,0x4d,0x5c,0x54,0x5d};
char greeting[25]={0x59,0x6f,0x75,0x20,0x68,0x61,0x76,0x65,0x20,0x6e,0x6f,0x77,0x20,0x65,0x6e,0x74,0x65,0x72,0x65,0x64,0x20,0x74,0x68,0x65,0x20};
for(int i=0;i<25;i++)
printf("%c",__s[i]^greeting[i]);
}
$ ./solve
picoCTF{qu4ckm3_6b15c941}
執行結果就直接print出Flag了
開始進入到兩顆星的題目了
題目給了一個asm2(0x6,0x28)的函式和組合語言程式碼,問說return的值是多少
這邊列出到part_b還沒做jle之前的stack給大家看
這裡他會比較EBP+0x8也就是0x6有沒有小於等於0x8f90然後進到part_a
這裡的組合語言相當於以下
while(0x6<=0x8f90){
0x6+=0x8f;
0x28+=0x1;
}
那這邊我就使用python
x=int('6',16)
y=int('8f',16)
z=int('28',16)
while x<=int('8f90',16):
x+=y
z+=int('1',16)
print('%x' %(z))
$ python solve.py
129
在加上picoCTF{0x129}就是Flag囉
其實第一題要練習應該還是要利用組合語言來分析,不過因為這個工具實在太強大了也想分享給大家,正確的運用工具可以大幅的減少在解題的時間,沒有時間一行一行組合語言慢慢看,有decompile也可以拿來對照自己解讀組合語言是不是正確,也是一個不錯的練習方法啦~