TUM CTF Teaser Reverse 10

不算太難的 Reverse ,比較像考 little-endian

建立 table

用 ida 看 發現是用 scanf %llx 讀入 64bit hex 表示的 long long int

輸入的數值會先被 |= 0x8000000000000000;

接著往下看是個 16 次的迴圈,是把輸入的數字每四 bits 取出當 index 加上 local 變數的地圵 找出這個位置後以 byte 為單位加一

把兩個 int64 裡面的 bytes 當 array 用

看 code 比較實在 XD

__int64 v10; // [sp+10h] [bp-18h]@1
  __int64 v11; // [sp+18h] [bp-10h]@1
v10 = 0LL;
  v11 = 0LL;

v4 = 0;
do
{
v5 = 4 * v4++; //從低位址開始 4bits 4bits 取 其實就是 hex 表示數字的一個字 (0~F)
++*((_BYTE *)&v10 + ((v3 & (15LL << v5)) >> v5)); // v10 是 int64 有 8ytes 但 4bits 可以表示到 15 這邊是伏筆
}
while ( v4 != 16 );

check 階段

一樣 16 次的 loop 這次變數(v6)從 0 ~ -15

v6 = 0LL;
  while ( 1 )
  {
    v7 = *((_BYTE *)&v11 + v6 + 7); // +7 常數所以是從 v11 的最後一個 byte 往前看 看到 v10 的最低 byte 為止
    if ( v7 ) // 若不為零 
    {
      if ( v7 != (_BYTE)v6 + 15 || v7 > 8u )
        break;
    }
    --v6;
    if ( v6 == -15 )
    {
      puts(":)");
      system("cat flag.txt");
      return 0;
    }
  }

若 byte 中不為零 會以下圖中數字 check

![](http://i.imgur.com/qVekBBT.jpg)

整理一下 若輸入 0 => |= 0x8000000000000000 => 15 次 index offset = 0, 1次 offset 8

=> v10 的第一的 byte 會變成 15, v11 的第一個 byte = 1

=> check 時希望 v11 的第一個 byte 要是 8 => fail

也就是要湊數字填 table, 為了讓 check 通過必須得數字出現的次數跟數值一樣 ex, 55555, 333, 999999999

然後要 16 位( 64 bits long long int) 因為數直會先被 |= 0x8000000000000000 也就是有一位被限制要 >= 8

以上就是全部條件 那就來填填看 0x8888888844443331 => 通過

存在多組解 符合以上條件都可以 ex 0x8888888855555333 也行

ASIS Reverse 125 License

License

IDA

讀 license file, named "_a\nb\tc_"

先做檔案長度校驗

-59762*x-1949670109068+14392*x^2 -1256*x^3-45235*x^4+44242*x^5=0 要成立

其中 x 為檔案長度 這邊被 IDA 雷了一下 parse 64 bit integer 時一直跳錯誤的數字 最後怒用 online tool 拆 bytes

丟 wolframealpha 或用 python 硬算一下 (推測長度不會太長) 得解 x=34

往下看 用 0xa 分割檔案內容 必須分割成等長五份 每份為 6 byts

6*5+4(分割用的0xa) 剛剛好 34 bytes

設為 s1, s2, s3, s4, s5

接著分別把某幾段 xor 後跟某 const string 比對

分成五次比對

1\. s1 xor s2 = const1

2\. s2 xor s4 xor 0x23 = const2

3\. s3 xor s4 = const3

4\. s4 xor s5 xor 23 xor s3 = const4

5\. s4 = const5

這邊 const 是串很長的 string 然後 6bytes 6bytes 切下來當 const1, const2 …

有已知 s4 其他都簡單算一下就有了

Python Script

Summer 2015

Life

忙碌的暑假終於要過完了 來寫點心得吧

從七八月 VMFive 實習 到 HITCON 再到 AIS3 暑訓課程
中間還穿插著要回中央值班,開會 偶爾假日還要回家
過著兩個多月的三點生活

三下時想說暑假不要荒廢,找了些公司去面試實習機會,由於之前的實習經驗覺的還是新創公司風氣比較自由,不論是知識共享或接受新知的程度都很高。

原本想直接找做資安相關的公司去實習,但不是我沒找到就是比較晚才釋出實習消息,所以就先找了些也蠻有興趣的公司去面試

面試過程也學習了不少 印象最深的就是 Dcard 創辦人之一 Kytu 面試時直接跟我說到:”等著實習/徵才消息出來才行動就輸一半啦 真的積極的人都直接丟簡歷/相關作品的”

另外也看到很紅的 VMFive 在徵實習 我對虛擬化技術也是蠻有興趣的 畢竟管了一台 ESXi. XD
跟 RD 主管 Patrick 面試過程很順利 面試中也提到了對資安的一些研究跟興趣
最後有幸能在 RD 部門做一些 Security 的研究

今年 HITCON 對我而言最大的看點就是許多跟 “輔助程式” 有關的議題 更有機會可以遇到程式作者
這次 HITCON 有 nano 板子的題目 但幾乎都是 coding 題 還有一關迷宮可能根本走不出去==

這個暑假學到最多的就是 AIS3(新型態資安暑期課程) 了 在八月初的時候進行了一場 AIS3 pre-exam 前面名次才有機會正取這門課程 新型態大概是說難得有時做這麼多的課程吧

這門課真的練到了許多以前聽過看過不會用的東西,課程中間還有場 MMA CTF 可以練習
課程間還把 Overthewire natas 破台
最後 Final exam 掛名 Bamboofox 打
web 連 1 分題都解不了啊 ◢▆▅▄▃ 崩 ╰(〒皿〒)╯ 潰 ▃▄▅▇◣
binary2 用爆破解出來頗爽 有機會來寫一下 write up

整個暑假最累的就是通勤了 實習期間雖然已經跑著借助別人家 但上班每天還是要通勤兩個小時 (公車 石牌-信義安和 走路) 週三還要跑回中央開會
HITCON 跟 AIS3 直接從中央住處每天通勤 超級累

也是實習後才知道學生時代是多麼的輕鬆悠閒 該來好好把握剩下的學生時光了

COC Proxy

項目起源

回鍋 COC 有好一陣子了,在 PaD 的坑結束後過一陣子乏力期,一打開 IDA 就全身酸軟。

五月初又是一陣期中報告,實習面試,雖然一直有想要拆開它的慾望,卻一直抽不出身

就在考多益的前一週突然渾身不對勁的跳坑開始著手研究

研究過程

準備

COC 和 Pad 不同,是走 raw socket, 這様窺探資料的難度增加了 (這年頭沒有明文傳輸了吧)

所以也不需要 wireshark,先用 apktool 解開 apk

翻了翻 smali 果然重點都不在 java 層, 將唯一的 lib libg.so 丟到 IDA。一看太好了,沒有加殼!

開 strings subview 找到伺服器和 port

使用 python 開 tcp socket proxy 準備中間人解密資料

要讓 app 改連 proxy 首先想到 /etc/hosts 但改了沒有用而且不通用(需要 root),後來是看到有現成的 fakedns,接著只要手動設定 wifi dns 地址即可。

之前弄的逆向相關項目幾乎都是用 C 實作,這次來玩玩看聽說處理底層資料也游刃有餘的 python 2

解密

接著是最關鍵的部分,如何解密資料流。

由於靜態分析功力有限,直接用室友舊手機開 COC 用 IDA 動態調適,沒有任何 anti-ptrace

attach 後對關鍵函式下斷分析。根據 proxy 觀察,每 3,4 秒會有心跳包送出,先針對 libc 中的 send 下斷

返回後向上觀察下斷找到 encryption function 會針對即將送出的 stream of bytes 做等長加密

小菜我缺乏密碼學知識啊!看到 function 不斷從一張表中用奇怪的方法挑出 byte 跟名文加密,也不知道這張表怎麼來

經過努力的觀察,終於發現有兩張表分別對應 send 跟 recv 而這兩張表在每次開 COC 時是固定且一樣的!!

雖然心中抱有懷疑,加密的 IV 可能會固定嗎? 但憑著不試白不試的心情將 IDA disassember 出的結果改進 python 中(非常醜)

實際實驗後(都已 global chat 測試)發現還是抓不到 仔細觀察後發現在第一次登入 packet 送出 server response 後整張加密表都變了!

貌似雖然開發公司對 binary 沒做保護但加密算法可不馬虎。只好針對第一次的 server response 動態 track

這邊走了偷吃步 分析過程看到了一串 const fhsd6f86f67rt8fw78fw789we78r9789wer6re 果斷 Google,果然人外有人,早就有補完計畫了 COCDP

透過文件,知道是以 RC4 進行串流加密,順便學習了一下 RC4 算法

雖然有文件支援 但是怕版本有更新 還是動態調適進去看 server nonce 怎麼被 KSA 使用,產生新的 S

Debug 一陣子後終於能成功解密

應用?

YA! 終於能看到資料了! ……然後呢? 突然想不太到有什麼應用

畢竟資料都在人家 server 裡,能做的事很有限。最近又聽聞某叉助手沒辦法模擬出陷阱了,想必是官方開始不信任 client,某叉駐守做不到的我也不想去撞牆

閒來沒事看了看傳出的資料,原來配對完成同時也將陷阱跟援軍資料都送過來了,那就來做個即時顯示器吧!

這樣打錢打水甚至爬杯時就不會被陰了

開發

抉擇

要將資料以圖像方式直覺顯示才行,用 python 繪圖嗎? Google 一下就開始頭痛了……

於是乎回歸 browser 強大魔法的懷抱 利用 browser 當 GUI ,資料傳輸就決定用 Websocket

SVG

畫圖就交給 d3.js + svg 囉

流程大致是

COC Proxy => websocket broadcast to web => d3.js render

後續

之後可能測試看看欺騙 client 端能達到什麼效果 像是讓敵人家只剩大本營之類的
或是做個爬杯 bot
不過最想試試看的是模擬野豬的路徑,找出最佳下兵點,可以避開陷阱最大化攻擊路徑
等有空吧 ……

結語

寫成紀錄文能重新整理思緒與資料,還不錯。之後來把 Pad 脫機戰鬥的記錄也發一發好了。

另外 fake-dns 也有很多可以運用的地方,當成工具筆記下來。

這個坑就先到一段落吧 五月六月還有一堆 deadline 要趕呢。

今天考的多益閱讀測驗應是送了四題題組,不知道過不過的了門檻啊。