iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
Security

我搶到旗子了!30天CTF入門系列 第 13

Day13 [Reverse] Ghidra

  • 分享至 

  • xImage
  •  

竟然兩顆星的題目比一顆星的簡單!?
其實做到這裡發現逆向的題目也很有趣,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也可以拿來對照自己解讀組合語言是不是正確,也是一個不錯的練習方法啦~


上一篇
Day12 [Reverse] 電腦不夠快怎麼辦
下一篇
Day14 [Reverse] 電腦不夠快怎麼辦(2)
系列文
我搶到旗子了!30天CTF入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言