跟隨武林少俠“飛停”,一路闖蕩江湖,終於來到終點。
在這場終局之戰中,有近1700人圍觀,歷時3天,只有一支戰隊——金左手,挑戰成功!
究竟是什麼樣的賽題難倒了大家呢?
出題團隊簡介簡介:
大龍貓超大隻,兔斯基毛茸茸。兔斯基保護協會光桿司令大龍貓是一隻軟體保護和逆向愛好者龍貓,愛做難題也愛出難題的格子衫程式設計師。團隊價值觀是,友誼第一,趣味至上!大龍貓會繼續萌力創作,給大家帶來更多有趣的賽題,用快樂和理性致敬大自然!
專家點評
金左手 戰隊隊長 ccfer 點評:
程式核心是一個數字邏輯電路的矩陣運算,難點在於對輸入三元組做了個非線性對映,並對對映關係做了邏輯膨脹化處理,使得程式碼量大幅增加,分析路徑變長。解題時需要正確識別出每個邏輯單元,對兩種功能單元做出邏輯化簡,輸入三元組的逆對映可以透過真值表解決,然後從三元組對映輸出端來看就是個簡單的線性變換了,解方程組即可。
賽題設計思路
本題採用規則二,且不涉及VM。
在本文中,
+表示異或,提到“加”說的也是異或。
“乘”表示“與”,AB表示A乘以B,即A&B.
!表示非,有最高的運算優先順序(僅低於取下標)
^表示冪。
*表示矩陣乘法時,矩陣元素的加法是異或
SOP (sum of products),這個大一計算機知識是本題的核心。
考慮邏輯閘RGX(Reversible Gate X,這是本題自己命名的,基於經典的邏輯閘RUG)。ABC是輸入,PQR是輸出,RGX是這樣的:(就是RUG的PQ互換)
P=AB+!A!C
Q=AB+BC+CA
R=B!C+!BC
這個門的描述是SOP形式(non-canonical SOP),從ABC到PQR是雙射。
Q=AB+BC+CA=(ABC + AB!C) + (ABC + !ABC) + (ABC+A!BC) = ABC + !ABC + A!BC+ AB!C
即 Q=non-cannonical SOP = 展開 = 合併同類項 = cannonical SOP,這個過程很重要。
Q=ABC + !ABC + A!BC+ AB!C,每項Product對應Q=1時的一個解,依次對應四個解是ABC={111,011,101,110},如果Q=0則解集是其補集。
根據P和R的值求得相應解集,解集求交即為解。對於可逆電路,有且只有唯一解。
有能儲存的下的cannonical SOP的時候,求解極為簡單。只有 non-canonical SOP 時,除一些特殊情況外,求解過程等價於求cannonical SOP。
對於非局域化可逆電路,cannonical SOP和真值表都是同等量級的,暴力方法在工程上不可用,這就是本題的難度原理。
可以用cannonical SOP求解PGX的逆運算,求得的逆運算InvRGX為:
P=!A!B!C+AB!C+BC
Q=B!C+AC
R=B!C+!AC
當然,這樣小規模,也可以用真值表求得
當輸入很多的時候,展開的複雜度是很高的,對於“不可局域化”(不能拆分成兩個門的並聯)且“Product因子數很少”的時候,
從non-cannonical SOP 到 cannonical SOP 的計算量很大。
當“Product因子數只有一個的時候”,SOP等價於矩陣乘法,求解簡單。
本題透過兩層計算構建“輸入很多,為126”且“非局域化”(可以局域化但需要技巧)且“Product因子數很少”的SOP,這種構造使得對SOP的逆向難度適中。
本題採用先並聯3輸入3輸出RGX門,再乘以可逆矩陣M,獲取這樣的126輸入126輸出大規模SOP。
RGX是SOP形式,矩陣乘法是SOP形式(矩陣乘法的P只有一個因子)
兩層SOP的計算結果是一層SOP,多少層SOP的計算結果都是一層SOP
先RGX並聯再矩陣乘法,得到一層non-cannonical SOP
這是本題核心模組,叫K吧(Kernel)
C=K(P) = M*RGX(P)
逆運算:
P=InvK(C)=InvRGX(InvM*C)
其中InvM是M的逆矩陣,RGX函式是RGX門的大規模並聯,InvRGX是InvRGX門的大規模並聯。
InvRGX上文已經求得了,現在說說如何求得InvM,也就是如何逆向出M,求逆矩陣誰都會嘛。
對於某一位輸出output,如果對應的矩陣的M的行為全1,那麼,
output=P[0]+Q[0]+R[0]+P[1]+Q[1]+R[1]+...+P[41]+Q[41]+R[41]=3341項Products,其中P[i]Q[i]R[i]是第i組RGX的PQR輸出。
根據程式中Products的缺失情況,可以得到M的這一行哪些元素為0。
對每一個輸出位做這個判斷,直接得出M的每一行。
如果我把順序打亂,那麼會更不明顯,更不容易還原,但我沒有這樣做。不想讓題在這個步驟太難。
另外,SOP的問題還有一個,就是有些對於某些輸出數值,特解特別好找。
所以,我要讓破解者真正逆向出演算法,或者至少找到十幾個解,以避免因為碰到特解好找而太過簡單。
方法就是,我用Kernel代替了AES演算法的AddRoundKey過程!
這個AES除了AddRoundKey被替換之外,完全沒有改其它,邊界明顯。
1、非局域化
2、合適的Products因子數
3、不是求單一特解
這三個條件的題目難度的必要條件,算一個難點。而且有些簡單。
增加點料,兩個難點更適合。
我要掩飾一下SOP
AB=!A<B
A+B=!(!A!B)
用這個把一部分“與”和“異或”變成了“<”參與的運算,這樣就行了!
這個變化不是看起來那麼雕蟲小技,而是利用了編譯器不最佳化時,對<運算的處理。
編譯結果沒有複雜多少,膨脹比例等同於真實的編碼比例,但是,乍一看,長得像VM。利用長得像,哈哈哈哈!本題就是這樣簡潔!
為了拉票,我介紹一下本題的潛力:
本題,我本質上實現了一個大規模NC1電路,而這個電路,可以用MBP轉化為矩陣計算,再加上隨機化,逆向難度大幅增加,是一個可以實用的軟體保護方案(缺點是程式碼大)
祝大家玩的開心!
賽題解析
本賽題解析由看雪論壇 ccfer 給出:
完整解析文章看這裡:https://bbs.pediy.com/thread-267878.htm
往期解析
1. 看雪·深信服 2021 KCTF 春季賽 | 第二題設計思路及解析
2. 看雪·深信服 2021 KCTF 春季賽 | 第三題設計思路及解析
3. 看雪·深信服 2021 KCTF 春季賽 | 第四題設計思路及解析
4. 看雪·深信服 2021 KCTF 春季賽 | 第五題設計思路及解析
5. 看雪·深信服 2021 KCTF 春季賽 | 第六題設計思路及解析
6. 看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析
7. 看雪·深信服 2021 KCTF 春季賽 | 第八題設計思路及解析
8. 看雪·深信服 2021 KCTF 春季賽 | 第九題設計思路及解析
主辦方
看雪CTF(簡稱KCTF)是圈內知名度最高的技術競技之一,從原CrackMe攻防大賽中發展而來,採取線上PK的方式,規則設定嚴格周全,題目涵蓋Windows、Android、iOS、Pwn、智慧裝置、Web等眾多領域。
看雪CTF比賽歷史悠久、影響廣泛。自2007年以來,看雪已經舉辦十多個比賽,與包括金山、360、騰訊、阿里等在內的各大公司共同合作舉辦賽事。比賽吸引了國內一大批安全人士的廣泛關注,歷年來CTF中人才輩出,匯聚了來自國內眾多安全人才,高手對決,精彩異常,成為安全圈的一次比賽盛宴,突出了看雪論壇複合型人才多的優勢,成為企業挑選人才的重要途徑,在社會安全事業發展中產生了巨大的影響力。
合作伙伴
深信服科技股份有限公司成立於2000年,是一家專注於企業級安全、雲端計算及基礎架構的產品和服務供應商,致力於讓使用者的IT更簡單、更安全、更有價值。目前深信服在全球設有50餘個分支機構,員工規模超過7000名。
公眾號ID:ikanxue
官方微博:看雪安全
商務合作:wsc@kanxue.com