今天是 6 月 7 號,高考第一天,首先祝福各位考生都能取得好成績。
看雪CTF 2017 第三題結束,第四題開始。
從第三題開始,比賽進入一個新階段,破解人數此時從第二題的 17 人降至 5 人,難度繼續增加。
為了應對比賽,很多小夥伴徹夜難眠,守在電腦前努力鑽研。下面的小夥伴還在公司呆了一宿,厲害了我的哥!
比賽前十名再次進行了更迭,此時風間仁衝上第一位,hyabcd、HighHand 位列其後。
目前整體前十名整體還沒有大的變動。
後面還有十一道題等著大家來挑戰,意味著還有十一次機會,大家加油!
接下來我們來看看第三題的點評與解析。
作者的題目採用
VB P-Code 編譯,用 xor 加密部分
p-code,誘導靜態反編譯工具得到錯誤的演算法。同時針對偵錯程式做了一些反除錯措施。在演算法上採用數學方程組求解的演算法,可以透過工具 matlab
或自己分析出演算法原型求解。此題在反除錯和演算法方面給攻擊者設定了不少障礙,中間留有很多坑,某個細節不注意可能就會陷入長長的困境中。此題反響熱烈,讓攻擊選手欲罷不能。
看雪 CTF2017 愛琴海CrackMe設計說明
原創演算法題, 延續 CTF2016 的設計風格, 也可以理解為數學應用題, 花費了個把小時創作。 難度適中,有利於甄別攻擊者的除錯分析、邏輯推理、發散思維、數學功底, 篩選出高低排名。
採用
VB P-Code 編譯, 加密 rva: 8427h、 8441h、 8493h、 84CBh、 857Bh 位置的
P-Code,加密解密均採用 xor,誘導靜態反編譯工具得到錯誤的演算法,使攻擊者陷入“ 盜夢空間” 而無法自覺。 隱蔽檢測
beingdebugged、 rdtsc、WKTVBDebugger 並根據檢測結果靜默干擾 P-Code 解碼演算法和流程。修改 OEP
RVA=0,使得某些除錯工具無法順利工作,並對 RVA=0 進行隱蔽檢測。設定堆疊段暫存器反除錯陷阱,迷惑攻擊者對入口 CALL 408E00
的單步跟蹤,一旦發現單步跟蹤則靜默進入程式,不對加密 P-Code 進行解碼。
上述反分析、反除錯都是手工使用 OD 彙編新增,順便手工對新增的彙編程式碼進行了簡單加花。
本作品使用的反分析、反除錯手段比較常見、適度。雖然反分析、反除錯可以使用更多的技巧, 但過猶不及,用得越多就越容易被攻擊者發現和拆解, 畢竟演算法才是本作品的靈魂。
要求攻擊者按十六進位制小寫格式輸入,總共 16 位, 8 位一組分別賦值給 x, y,參與計算,滿足驗證公式即註冊成功。 演算法概況如下:
初始條件:
a = 1711722997
r = 373414231.362502
R = 874402299.931726
驗證公式:( 0
對於不同水平的攻擊者,可以預料到如下結果:
一、 無法分析出演算法, Game over。
二、 分析出演算法,但沒有看出演算法的真實用意, 不知道如何化簡去繁, Game over。
三、 分析出演算法,雖然不明白演算法用意,但對公式進行了化簡,推理出: y=2*r*R*(x+a)/(a*x-2*r*R),按此條件約束窮舉變數,則可以在幾分鐘內窮舉出結果。
四、
分析出演算法,弄明白題設的是海倫公式、 三角形內接圓半徑、三角形外接圓半徑驗證公式, 給出了三角形長邊 a,內接圓半徑r,外接圓半徑 R,
要求攻擊者找到三角形另外兩個邊長 x,y, 則根據尤拉公式 OI^2=R^2-2*R*r 計算出內外圓心距離
OI,透過CATIA/PROE/UG/CAD 等引數化作圖法迅速找到答案( 題設標準解法)
本題很好玩, 答案: 5e9a3f183e37f900 您答對了麼? ^_^
愛琴海,汽車底盤工程師,從事汽車底盤系統設計開發和管理工作多年,浙江台州人,80後心懷夢想、不忘初心的青年。業餘愛好: 逆向分析、吉他彈唱、程式設計、羽毛球、登山、旅遊、經濟、散步等。
2001年在路邊攤上看到了本電腦雜誌,從此對計算機語言和逆向產生興趣,會逆向破解的人就像武俠世界裡頭的俠客行走江湖、快意恩仇,令人心生嚮往。此後自學彙編,VB,C,微控制器等,早期網際網路能找到的破解教程不是很多,windows98主流的年代,也沒有更多的朋友交流學習。2006年加入了看雪論壇,這是個氛圍非常棒的平臺,可以向各位前輩、高手學習知識和經驗,大家都很有熱情。此後與一些志同道合的朋友成立了Sea
Cracking
Group(SCG)組織,擔任過OCN版主。後來OCN、SCG逐漸淡出江湖,成員也都各有家庭和忙於事業,很少活動在世人視野中。後來因為年輕氣盛,不懂得保護自己,破解了一款國產軟體招來麻煩,從此銷聲匿跡了一些年。因為不是計算機相關專業出身,也不是從事計算機相關工作,純粹是業餘愛好,深知學無止境、一山還有一山高,今後希望與各位朋友學習交流,共同成長。80後痴狂的青春——無悔!
這道題主要是要發現演算法裡的坑。
拿到程式發現是 VB 的程式,使用 VB Decompiler 進行反編譯,發現演算法非常清晰,如下圖所示。
這是一個二元方程組,global_84
和 global_92 是輸入內容的左邊八位和右邊八位,並且兩者都大於 0,global_84 大於
global_92。這兩個數是方程組的兩個未知數。global_76,global104 和 global100 都是已知的,其他全域性變數都為
0。令global84=a,global92=b,global76=c,global104=N1,global100=N2。可以將 VB
Decompiler 反編譯得出的方程組簡化如下。
透過 matlab 進行計算,發現求出來的值都是複數,也就是說不存在實數解,踩坑了。看來反編譯出來的程式碼應該有問題,看 VB
Decompiler 中反彙編的 p-code,發現和反編譯的程式碼可以正確對應,所以問題不在這,這時就得看看是不是在將 p-code 位元組反彙編成p-code時出現了問題。
程式無法用
OD 開啟,不過可以使用 OD 附加程式分析。我們從反編譯的程式碼中可以發現他使用了 Left 和 Right
函式去獲取輸入的左邊八位和右邊八位。因此可以直接對這兩個函式下斷。找到這些函式有個捷徑,我們可以在 VB
虛擬機器的入口上方發現一些jmp指令,從這些指令可以直接找到 Left 函式的地址,下斷即可。
由於這個程式主要是進行方程的求解,因此VB虛擬機器執行的過程十分清晰。在 VB 虛擬機器中,esi 存放 p-code 的 eip,我們在VB虛擬機器中單步除錯時,可以觀察 esi 暫存器的變化,然後和 VB
Decompiler 反彙編出的 p-code 的地址對應起來,以確定當前的 p-code 指令對應的是什麼操作。比如如下圖所示。
當前
esi 暫存器的值是 4083fa,說明當前 p-code 的 eip 是 4083fa。VB 虛擬機器會將4083fa中的 p-code
位元組碼傳遞給 al,並作為虛表的偏移去找下一個要執行位置。從VB
Decompiler 中可以看到 4083fa 位置的 p-code 指令是 MulR8,也就是乘法,那麼VB虛擬機器透過 p-code
位元組碼找到虛表偏移後進入的地方就是來執行乘法這樣一個操作。這個地方就是上圖 jmp 指令跳轉到的地方,進入後可以發現確實是執行乘法。
如此一來就可以根據 p-code 和對應的操作去確定是哪個地方出現問題,由於程式中多是加減乘除次方這樣的計算,對應的操作都是浮點運算操作,可以很清晰地跟蹤它的計算流程。
前面的流程都沒有問題,直到 p-code 到達 408427 時,從 VB Decompiler 反彙編的 p-code 中可以得出這是個 AddR8 指令。但是我們發現該位置的指令位元組碼是 0xAF。
在前面的跟蹤,我們發現AddR8指令位元組碼是0xAB,這裡0xAF被VB Decompiler認為是AddR8指令,可見VB
Decompiler反彙編p-code時出了問題,跟進jmp可以發現這其實是個SubR4指令,是個減法,而VB
Decompiler認為他是加法。(根據愛琴海的設計文章,可以知道在程式中對這些指令進行了修改,由於我是用OD附加除錯,除錯是在反除錯內容之後進行的,僥倖繞過了這個坑)
繼續跟蹤可以發現流程還有其他幾個地方存在這個問題,出現的位置就是在方程組第一個方程中a^4,b^4,c^4前的符號,這裡應該是減號,所以第一個方程應該是
0.5*(-a^4-b^4-c^4+2*a^2*b^2+2*b^2*c^2+2*a^2*c^2)^0.5/(a+b+c)=N1
那麼方程組就是
(PS:第二個式子是海倫公式,N2是三角形外接圓半徑,冥冥之中感覺這個方程應該是求解三角形三邊之類的。。)
使用matlab計算,可以得出a=1587167000,b=1043855616。由於a是左邊八位,b是右邊八位,輸入要求十六進位制,因此最終答案為5e9a3f183e37f900。
最後感謝 WiFi 萬能鑰匙安全應急響應中心的贊助支援,
接下來的比賽大家一定要使出洪荒之力哦!↖(^ω^)↗
比心 ❤
上海連尚網路科技有限公司成立於
2013 年,是一家專注於提供免費上網和內容服務的移動網際網路企業。連尚網路自主研發的核心產品 WiFi
萬能鑰匙,以分享經濟的模式,透過雲端計算和大資料技術,利用熱點主人分享的閒置WiFi資源,為使用者提供免費、穩定、安全的上網服務,以幫助更多的人上網,找到屬於他們的機會,改變自己的命運。