iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 14
1
Security

CTF 的三十道陰影系列 第 14

Day14: [Reverse] PPP & Plaid CTF

前言

前幾天介紹 DEF CON CTF 或 geohot 都不斷提到 PPP 這個隊伍,今天就來簡介一下 PPP 和他們辦的比賽 Plaid CTF

PPP & Plaid CTF

PPP 的全稱為 Plaid Parliament of Pwning,是美國 CMU 大學在 2009 成立的 CTF 戰隊,詳情可以參考官方網頁:https://pwning.net

如今十年過去,PPP 可以說是目前全世界最強的 CTF 戰隊也不為過,裡面比較有名的成員像是:

  • geohot: 前幾天的文章有介紹過他,雖然目前已經不是隊伍成員,但他參加的 2013, 2014 兩年 PPP 都以壓倒性的實力獲得 DEF CON CTF 冠軍 (2015 雖然中途有加入比賽,但還是由韓國 DEFKOR 拿下冠軍)
  • rickyzhou: PPP 專門做 pwn 的選手,不過這些年好像比較少看他打比賽 (?) 以前經常看他的 exploit 學習如何打 pwn 和 heap,像是這一份 stkof.py,在當時連 pwntools 才剛起步的年代,exploit 都用 python socket 和 struct 硬幹 XD 曾經在 geohot 的 livectf 實況兩人比賽看誰能最快打穿 firefox ...
  • nneonneo: a.k.a Robert Xiao,PPP 的 reverse 大神,每年 Fireeye 舉辦的 flare-on challenge 幾乎都率先破台,今年 DEF CON CTF 和其他一個成員秒殺 LISP 題硬生生把戰局逆轉奪冠 Q__Q 另外他也是 PPP 少數會講中文的人 XD
  • tylerni7: 於 2011~2013 擔任 PPP 隊長帶領 PPP 第一次打進 DEF CON CTF,卸任後也持續對 PPP 在 CMU 的經營給予幫助,對 PPP 能持續發展至今有重要貢獻,還有跟 ForAllSecure 一同參加 DARPA CGC 的自動攻防競賽
    • 之前有和 PPP 的另一名成員 Erye 來台灣 AIS3 當過講師,Erye 當時是 Fireeye 的 Malware Researcher,前陣子跟兩人結婚環遊世界 (灑花

Plaid CTF 自從 2011 年以來舉辦了第一屆,是 DEF CON CTF 的種子賽事之一,也是世界上最優秀的 CTF 之一, 在 ctftime 上一直保 80 分以上的評價,每年的題目都可以讓大家學到新知識,像是今年 Plaid CTF 2019 出的 Spectre 就是參考去年很有名的 CPU 漏洞 Meldown & Spectre 設計,讓大家從解題過程中學習相關原理

  • Plaid CTF 2015, 2016, 2017, 2019 都是由台灣戰隊 217 獲得冠軍

此外,PPP 也毫不吝嗇地分享自己的解題心得以及辦 CTF 的經驗給大家,每年 DEF CON CTF 完也會舉辦 after party 邀請參賽隊伍來聊天和分享解題經驗,必須說這幾年 CTF 的發展如此迅速,PPP 是最大的功臣也不為過,BTW,參加 after party 可以領 Plaid CTF 的 T-shirt 來穿,耐看又好穿 XDD

最後提一下,PPP 從 2017 開始協助舉辦 picoCTF,特色是題目簡單、多樣,且有比較長的競賽時間讓大家可以按照自己的步調解題,對初學者來說是個十分友善的途徑來開始接觸 CTF ... XD 今年的 picoCTF 已經開始進行,比賽時間是 9/27 ~ 10/11,對 CTF 有興趣的人可以嘗試接觸看看,應該會有所收穫 :D

0x0d: Plaid CTF 2018 Reverse 200 Plaid Adventure

Plaid CTF 設計的經典題目很多,但也都頗有難度....XD 這次先講去年出的一道 reverse 題,題目有趣又可以學到新東西,最後逆向完也不需要太困難的知識就可以解出題目,可以說是 CTF reverse 題的典範,之後有機會應該會花整篇文章來講一些比較難的題目,今天詳細的解題過程可以參考這篇 blog:


Plaid Adventure 被分類在 reverse 題,但下載檔案回來後發現是一些網頁的檔案,搭建起來之後我們可以在瀏覽器上以 Interactive fiction 的形式玩文字解謎遊戲,畫面大概長下面這樣:

遊戲的場景是 Cavern Maze,地圖不算複雜,可以靠正常的遊玩把所有地圖走一遍,可以入手的道具有:

  1. 紅、藍、黃、綠 四色寶石各一顆
  2. 大門鑰匙

獲得所有道具後,在某個地圖可以用大門鑰匙開門進入最後一章地圖,地圖內有一台機器讓我們放置前面收穫的四色寶石,依序放上後,要用特定的順序觸碰寶石,至此為止要開始逆向遊戲才能知道正確順序

首先要知道題目能運行是因為給的 web 檔案裡有一份 Plaid Adventure.gblorb.js,這份 js 檔是 Glulx 的 simulator,可以把 js 裡面用 ArrayByte 儲存的檔案載入進行遊戲,我們需要先把 ArrayByte 的內容 dump 成 gblorb 的檔案之後,才能開始進行逆向分析

可能是曾經有人破不了關惱羞成怒,已經有現成的工具 mrifk 可以將 gblorb 轉成 pseudo code 進行閱讀,內容會長得像這樣:

[ routine221097 local0 ;
    local0 = 0;
  .label221105:
    if (local0 < 16) {
        478466->local0 = 0;
        local0 = local0 + 1;
        jump label221105;
    }
    return 1;
];

routine221097 相當於平常寫 code 的 function,local0 是區域變數或 function 參數,配合程式其他的
字串 Object 就可以開始閱讀程式的邏輯,最後會找到三個關鍵 routine:

  • routine221131
    • 處理 touch 礦石這個 action,做的事情是把每三次觸碰的寶石顏色轉成一個數字,再存入一個長度 16 的矩陣
      • red: 0b01
      • blue: 0b10
      • green: 0b10
      • yellow: 0b11
    • e.g. 觸碰紅色三次就代表 0b010101 = 21
  • routine220666
    • 判斷觸碰的順序是否正確,正確則進入 routine221211 印 flag
    • 將 routine221131 得到的矩陣與位於 478802 的二維陣列相乘,得到的結果要與 478482 的陣列相同
    • 只要
  • routine221185
    • 輸入隱藏指令 xyzzy 可以觸發
    • 478482 矩陣的第 16 個 value + 1

逆向完上述三個 routine 之後,就可以明白這題就是線性代數的問題:AB=X, 已知 B 和 X,求 A 的值?

  • A 為觸摸寶石得到的一維矩陣
  • B 為 478802 二維矩陣
  • X 為 478482 的答案
  • 只要求出 B 的反矩陣與 X 相乘就可以得到結果

最後按照順序觸碰寶石,程式就會將正確的 flag 印出,也成功破關這款遊戲 XD

The four orbs get brighter and brighter, as the machine starts violently whirring and clicking. You close your eyes as blinding light fills the room. When you finally open your eyes, you find yourself outside of the cavern, holding the flag in your hands:

PCTF{Tw1styL1ttl3Fl4g}

*** The End ***


上一篇
Day13: [Misc] DEF CON CTF
下一篇
Day15: [Pwn] DEFKOR & Cykor
系列文
CTF 的三十道陰影31

尚未有邦友留言

立即登入留言