看雪·眾安 2021 KCTF 秋季賽 | 第三題設計思路及解析

Editor發表於2021-11-22

圖片


看雪·眾安 2021 KCTF秋季賽的第三題《矇混過關》歷時4天,已於今天中午12點關閉攻擊通道,截止答題。那麼目前的比賽情況如何呢?


攻擊方排名前10如下:

圖片

已開放賽題的4支防守隊伍排名如下:


圖片


經統計,第三題《矇混過關》圍觀人數1854


圖片


最終無人“矇混過關”,攻破該題。可以看出此題設計思路之巧妙,破解難度之高!想必大家對該題都充滿了求知慾圖片接下來和我一起看看解析吧~


出題團隊簡介


第三題《矇混過關》出題方:中婭之戒 戰隊

出題者:海風月影


圖片


賽題設計說明


規則採用方案二:有混淆,無VM。

 

檔名:cm.exe
檔案大小:6.63 MB (6,962,176 位元組)
CRC32:BDC342F3
MD5: 18CE92A6F3F7CCEFE7F78FF0AF4F4BE9
SHA256:5106D6BDEF101BCD3113CB065C0849B823B5074412F1B11D4E46681428795B02

 

給一組正確的序列號: 

name:5106D6BDEF101BCD
serial:7280A2E68D16E3BE47DC69F8FDD0304E65DF5DA7F04BFDB1936CE8620211CFFC



一、賽題故事背景


喵喵幼兒園裡有很多個喵寶寶,每天早上園長都要讓所有寶寶簽到。寶寶們活波好動,不守規矩,於是園長想出了一個好玩的簽到辦法。


園長準備了一個毛線球給寶寶們玩,寶寶們都爭相上去用小爪子拍它,毛線球被拍得亂飛。只有當毛線球被所有喵寶寶都拍過之後,它就會自動爆開變成一場漂亮的毛線雨。


毛線雨落到地上。正好是園長的名字,園長和喵寶寶們就都開心了。



二、整體架構設計


輸入:園長名(name),序列號(serial),name任意長度,serial 256bit


輸出:是否成功。

園長:維護一張寶寶簽到表,一個偽隨機數發生器DRNG(內部64bit,輸入輸出32bit),SHA256(name),serial,這4個是全域性的。


寶寶:一共31個,每個寶寶有一個特性值VI(256bit)。

驗證流程:

1、用name初始化偽隨機數發生器,初始化所有寶寶的VI,園長名取SHA256(name),保證過程不可逆,serial,256bit,直接作為園長的毛線球;

2、開始選擇第一個寶寶,把毛線球給他;
3、當前拿毛線球的寶寶CurrentBaby簽到,然後隨機選擇另一個寶寶TargetBaby,改變TargetBaby的特性值VI;
4、當前寶寶改變園長的毛線球(serial);
5、如果所有寶寶均已簽到完成,跳轉到步驟7;
6、當前寶寶隨機選擇另一個寶寶Baby2,然後毛線球傳給Baby2,用Baby2,修改當前寶寶CurrentBaby的特性值VI;
7、跳轉到步驟2;
8、毛線球爆炸;
9、判斷爆炸後的毛線雨落在地上,判斷是否正好是輸入的name。


上述過程中的演算法:


1、偽隨機數發生器:DRNG,rand的改造版,無法逆運算,無法輕易預測,有兩個過程:
更新 -> 輸入32bit,改變內部結構;
輸出 -> 改變內部結構,輸出32bit;


2、RunVM:RunVM(A, B),輸入兩個256bit大數,A,B。將A,逐步更新到DRNG中;從DRNG中,取32bit中的最低2bit,有4種可能性。

(1)喵演算法
(2)MixColumn-cbc
(3)XTEA-cbc
(4)Dummy-cbc

分別用4種演算法,對B進行修改,整個過程,會修改B的值,此為可逆運算。

3、修改園長的status:RunVM(Baby->VI, serial)


4、一個寶寶改變另一個寶寶的個性資料:流程如下:
saveVI = tarBaby->VI;
RunVM(currBaby->VI, tarBaby->VI)
tarBaby->VI ^= saveVI
整個過程,被修改的VI,此為不可逆運算。

5、選擇一個寶寶:DRNG隨機數選擇一個寶寶。


6、毛線球爆炸:橢圓曲線混淆版點乘演算法,此為可逆運算。



三、具體演算法


OI1:喵演算法,本身演算法沒有什麼特殊意義,把256bit分成8個32bit,分別加減異或,全部看懂邏輯後,逐步可逆。


OI2:MixColumn-cbc,基礎演算法是Aes裡面的MixColumn,矩陣係數改了,處理32bit,看懂 https://bbs.pediy.com/thread-267902.htm 帖子後,輕鬆黑盒搞定。


OI3:XTEA-cbc,改了係數的標準XTEA演算法,處理64bit,常量0x9E3779B9改成了0xB7E15163。


OI4:Dummy-cbc,32bit,在48組可逆演算法中選擇一組進行加密,每組都由簡單異或取反加減等演算法組成。

以上4個演算法,會呼叫很多遍,都是分組演算法,分別為:256bit一組,32bit一組,64bit一組,32bit一組,組與組直接,由CBC模式連線,如需要key,iv,從DRNG輸出中獲取。

OI0:毛線球爆炸,橢圓曲線中的半點乘演算法,橢圓曲線使用國密SM2(推廣宣傳國密演算法)

    SM2:y^2 = x^3 + ax + b       Fp - 256       p =FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF       a =FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC       b =28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93       n =FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123       Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7       Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0


    定義點乘演算法:y = kx(k, x)
    y = k * x,k,y,x均為256bit。


    正常橢圓曲線的點乘,Y = k * X,Y和X都是座標,都由2個256bit組成。


    這裡的演算法中,小寫表示只有256bit,由於缺失了半個座標,使整個過程有點難懂。


    構造特殊的 y,使得進行逆運算能夠有正確的x解。求k對於橢圓曲線階的逆revK = k^-1 MOD N,其中N是橢圓曲線的階(公開常量,谷歌搜尋),由於 y = k*x,所以 x = y/k = kx(revK, y),得解。

    最後的毛線球爆炸,就是讓y = name, x = serial,驗證 k * serial 必須等於 name,其中k是DRNG中輸出的。毛線球爆炸的演算法OI0只用一次。



    賽題破解思路


    1、解決反除錯和記憶體校驗,找到正確的3個記憶體校驗值,並patch程式,三個校驗值分別為:011EE725,B06B784D,3F93CAB9;


    2、找到修改園長Serial的RunVM,hook這裡,得到整個執行的全部序列以及相應的引數context_logs;


    3、搞定OI0 - OI4這5個演算法,寫出逆演算法,其中OI4,不需要全部搞定,只需要找到對應的那幾個即可;


    4、寫程式,根據上面的context_logs,逆運算求解即可。


    題目答案

    name: KCTF
    serial: CCBFB1FA4D9333348E946BBDF0A809129C7051780B7873C589DFCBA0C84B214B



    解題難點


    演算法難點:

    OI0:需要對橢圓曲線演算法比較瞭解,需要有一定的數學功底;


    OI1:不是單步逆向的演算法,需要整體看懂,才能逆運算;


    OI2:加密解密由查表異或完成,表經過了複雜的處理,但整體是線性運算,因此黑盒比較容易解;


    OI3:常量換了,需要很熟悉XTEA才能看懂;


    OI4:內建了48組演算法(但一個name跑下來,未必覆蓋所有演算法),需要一定的工作量。


    逆向難點:

    1、大數運算庫自寫,整個流程完全內聯,使得函式超級長,不容易分割處理;


    2、整個程式全部使用了混淆(無VM),進一步加大逆向難度(主要是無法用IDA F5了);


    3、加了記憶體校驗,一共3處,3次的校驗一共有3個校驗值,分別輸入到DRNG隨機數中干擾過程輸出,因此一旦記憶體校驗不通過,最後結果是不正確的。而記憶體校驗的過程中會觸發反除錯檢查,而反除錯檢查會干擾記憶體校驗值,使得整體除錯變得非常困難,需要一定的技巧才能正確跑通;


    4、整體演算法流程是單向的,中間的4個演算法,由於name不同,所以DRNG初始化是不同的,中途輸出的所有隨機數,都不相同,因此呼叫OI1-OI4的順序也是不一樣的。這使得攻擊者,必須先逆出4個演算法,然後還得找到正確的順序,才能求解。


    [原創] 喵喵幼兒園【中婭之戒】 - KCTF 2021 秋季賽 第3題設計思路-CTF對抗-看雪論壇-安全社群|安全招聘|bbs.pediy.com



    往期解析


    1、看雪·眾安 2021 KCTF 秋季賽 | 第二題設計思路及解析


    圖片


    圖片

    第四題《偶遇棋痴》正在火熱進行中,

    還在等什麼,快來參賽吧!



    看雪CTF(簡稱KCTF)是圈內知名度最高的技術競技之一,從原CrackMe攻防大賽中發展而來,採取線上PK的方式,規則設定嚴格周全,題目涵蓋Windows、Android、iOS、Pwn、智慧裝置、Web等眾多領域。


    看雪CTF比賽歷史悠久、影響廣泛。自2007年以來,看雪已經舉辦十多個比賽,與包括金山、360、騰訊、阿里等在內的各大公司共同合作舉辦賽事。比賽吸引了國內一大批安全人士的廣泛關注,歷年來CTF中人才輩出,匯聚了來自國內眾多安全人才,高手對決,精彩異常,成為安全圈的一次比賽盛宴,突出了看雪論壇複合型人才多的優勢,成為企業挑選人才的重要途徑,在社會安全事業發展中產生了巨大的影響力。




    眾安資訊科技服務有限公司(簡稱:眾安科技)


    基於區塊鏈、人工智慧、大資料、雲端計算等前沿技術探索,以科技構建生態新基建。經過實際業務驗證,圍繞三大核心產品系列——業務增長系列、業務生產系列、業務基建系列,覆蓋保險經營中的產品設計、精準營銷、核保核賠、服務與運營管理等關鍵環節,打造高效、安全、可靠的技術產品與解決方案,助力保險生態及更多金融、電商、線上教育、融媒體等行業客戶實現數字化升級。


    圖片

    - End -


    圖片

    公眾號ID:ikanxue

    官方微博:看雪安全

    商務合作:wsc@kanxue.com

    相關文章