看雪.WiFi萬能鑰匙 CTF 2017第七題 點評及解題思路
看雪CTF 2017 比賽進行至第七題
截止至今天中午12點,第七題破解人數為16人!
攻擊方排名前十名變動較大,比賽排名有人升、有人降。
loudy上升4位,從第十升到第5位!
EricAzche也升到第7位,
本題過後,又一位新面孔衝進前十,kkHAIKE
誰會獲得最終的大獎呢?最後的前十名又是誰呢?
期待ing......
接下來我們來回顧一下第六題
看看 看雪評委和出題者是怎麼說的ヾ(๑╹◡╹)ノ"。
看雪評委 netwind 點評:
此題作者採用了多種反除錯手段給攻擊方增加了不少難度。透過int3
異常觸發程式執行流程;透過TLS對OEP進行異或加密;透過對部分函式進行加密,讓其以SMC動態解碼的方式執行來保護函式不被除錯分析;透過對程式進行自效驗的方式,防止被篡改。演算法上採用約瑟夫環變形處理。此題難在考察攻方選手繞過反除錯的能力。
作者簡介:
作者不問年少,本名蔣超。畢業於西南交大計算機系,現在鐵路行業任資料庫系統工程師。愛好計算機程式設計(熟悉C/c++/Basic等語言)、電影、遊戲、逆向分析、跑步、象棋等。2008年左右接觸看雪,我認識了很多朋友,謝謝你們的幫助,讓我不斷成長,也學到了很多新的知識!
看雪 CTF2017 第七題設計思路
註冊碼說明:原註冊碼為 bwns@pediy!後來根據要求全改為字母加數字,連空格都去掉了!
現註冊碼為:BwnsAtPediy2017KX9Ok
註冊成功截圖:
製作思路:
來源於約瑟夫環的變形處理。將一張碼錶看成一個圈,取使用者輸入的字元在碼錶中的下標。然後從此字元的下一字元處開始移動其下標值/5+5(這樣做為了大幅度減少迴圈次數),然後取對應的字元,對此字元進行高5位低3位移位操作後,取其HEX字元進行驗證。
驗證方式為對每個字元的ASCII值/4的商,餘數比較。(可由此進行註冊碼的反推。)
其他處理:
1、在Button中進行了特殊處理,使用int3異常開始遊戲,必須觸發異常,否則就退出了。
2、用TLS對OEP進行異或解密。
3、使用了SMC對顯示對話方塊解碼,解碼的KEY即為使用者輸入的字元。此處用了try-catch包裹,故輸入不正確的key不會崩潰。
4、StartGame函式也進行了 SMC 加密,執行時解密,完成後再加密。
5、對EXE加入簡單自校驗,使用MapFileCheckSum(測試發現此處360會誤報木馬),若發現改動,直接退出。
6、SMC均採用IDA直接檢視地址後精確處理,無其它標記,製作稍麻煩。
關鍵程式碼:
序言:
本題採用TLS、SMC等反除錯、反分析手段,演算法為索引一個64位元組“環”匹中密文再進行加密和隱藏比較,
並利用註冊碼進行SMC解碼,想爆破都不容易!本題演算法和防護手段都算上乘之作,無奈碰到了大神而飲恨。
本文是在提交答案之後重新寫的,假設輸入答案:BwnsAtPediy2017KX9Ok,節省筆墨紙硯,努力把文章寫好。
一、查殼,試執行,分析TLS反除錯
//首先查殼,Microsoft Linker(14.0)[EXE32],OD載入直接執行,OEP停不下來,噶麼鬼?
//檢查PE格式發現TLS
//勾選SOD外掛“Break On Tls”,重新載入,跟蹤40C120 TLS函式,看看都做了什麼小動作
//載入停在了40C120
0040C120 55 PUSH EBP 0040C121 8BEC MOV EBP,ESP 0040C123 83EC 10 SUB ESP,0x10 0040C126 A1 84044000 MOV EAX,DWORD PTR DS:[0x400484] 0040C12B 33C5 XOR EAX,EBP 0040C12D 8945 FC MOV DWORD PTR SS:[EBP-0x4],EAX 0040C130 837D 0C 01 CMP DWORD PTR SS:[EBP+0xC],0x1 0040C134 53 PUSH EBX 0040C135 56 PUSH ESI 0040C136 57 PUSH EDI 0040C137 75 48 JNZ X7-不問少.0040C181 0040C139 8365 F0 00 AND DWORD PTR SS:[EBP-0x10],0x0 0040C13D 60 PUSHAD 0040C13E 64:A1 18000000 MOV EAX,DWORD PTR FS:[0x18] 0040C144 64:A1 18000000 MOV EAX,DWORD PTR FS:[0x18] 0040C14A 8B40 30 MOV EAX,DWORD PTR DS:[EAX+0x30] 0040C14D 8B40 08 MOV EAX,DWORD PTR DS:[EAX+0x8] 0040C150 8B58 3C MOV EBX,DWORD PTR DS:[EAX+0x3C] 0040C153 03D8 ADD EBX,EAX ; 取得PE頭地址 0040C155 8B5B 28 MOV EBX,DWORD PTR DS:[EBX+0x28] 0040C158 03D8 ADD EBX,EAX ; 取得OEP 0040C15A 895D F0 MOV DWORD PTR SS:[EBP-0x10],EBX 0040C15D 61 POPAD 0040C15E 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-0xC] 0040C161 C745 F4 EB7458CC MOV DWORD PTR SS:[EBP-0xC],0xCC5874EB 0040C168 66:C745 F8 E875 MOV WORD PTR SS:[EBP-0x8],0x75E8 0040C16E 6A 06 PUSH 0x6 ; 金鑰長度 0x6 位元組 0040C170 50 PUSH EAX ; 異或金鑰 EB 74 58 CC E8 75 0040C171 68 C8000000 PUSH 0xC8 ; 解密 0xC8 位元組 0040C176 FF75 F0 PUSH DWORD PTR SS:[EBP-0x10] ; OEP 起始地址 0040C179 E8 584C0000 CALL 7-不問少.00410DD6 ; 利用6位元組金鑰迴圈解密並清除OEP開始0xC8位元組 0040C17E 83C4 10 ADD ESP,0x10 0040C181 8B4D FC MOV ECX,DWORD PTR SS:[EBP-0x4] 0040C184 5F POP EDI 0040C185 5E POP ESI 0040C186 33CD XOR ECX,EBP 0040C188 5B POP EBX 0040C189 E8 CD7D0000 CALL 7-不問少.00413F5B 0040C18E 8BE5 MOV ESP,EBP 0040C190 5D POP EBP 0040C191 C2 0C00 RETN 0x
//使用6位元組金鑰“EB 74 58 CC E8 75”分別異或OEP入口0xC8位元組程式碼,還原並清除了OD自動設定的OEP斷點,所以載入就跑飛了。
//接下來對程式碼段設定記憶體訪問斷點,幾次執行後就能斷到OEP
00414422 > E8 16050000 CALL 7-不問少0041493D 00414427 ^ E9 5CFEFFFF JMP 7-不問少00414288
二、分析主體流程
//斷點 bp GetDlgItemTextA,輸入註冊碼,單擊“開始驗證”
0012FAE0 00410502 /CALL 到 GetDlgItemTextA 來自 7-不問少.004104FC 0012FAE4 000E02A0 |hWnd = 000E02A0 ('CrackMe By 不問年少',class='#32770') 0012FAE8 000003E8 |ControlID = 3E8 (1000.) 0012FAEC 0012FB20 |Buffer = 0012FB20 0012FAF0 00000064 \Count = 64 (100.)
//斷下來之後,返回主程式
004104F1 6A 64 PUSH 0x64 004104F3 50 PUSH EAX 004104F4 68 E8030000 PUSH 0x3E8 004104F9 FF76 04 PUSH DWORD PTR DS:[ESI+0x4] 004104FC FF15 283E4500 CALL DWORD PTR DS:[; user32.GetDlgItemTextA 00410520 C745 E8 5045444>MOV DWORD PTR SS:[EBP-0x18],0x49444550 00410527 53 PUSH EBX 00410528 BF 301B4100 MOV EDI,7-不問少.00411B30 0041052D C645 EC 59 MOV BYTE PTR SS:[EBP-0x14],0x59 ; PEDIY 00410531 57 PUSH EDI 00410532 E8 9F080000 CALL 7-不問少.00410DD6
//用“PEDIY”作為金鑰,解密426位元組,對應“CALL 00411B30”所需要的主演算法程式
00410DD6 /$ 55 PUSH EBP 00410DD7 |. 8BEC MOV EBP,ESP 00410DD9 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+0x8] 00410DDC |. 56 PUSH ESI 00410DDD |. 33F6 XOR ESI,ESI 00410DDF |. 3975 0C CMP DWORD PTR SS:[EBP+0xC],ESI 00410DE2 |. 7E 17 JLE X7-不問少.00410DFB 00410DE4 |. 57 PUSH EDI 00410DE5 |. 8B7D 10 MOV EDI,DWORD PTR SS:[EBP+0x10] 00410DE8 |> 8BC6 /MOV EAX,ESI 00410DEA |. 99 |CDQ 00410DEB |. F77D 14 |IDIV DWORD PTR SS:[EBP+0x14] 00410DEE |. 8A043A |MOV AL,BYTE PTR DS:[EDX+EDI] 00410DF1 |. 3001 |XOR BYTE PTR DS:[ECX],AL 00410DF3 |. 41 |INC ECX 00410DF4 |. 46 |INC ESI 00410DF5 |. 3B75 0C |CMP ESI,DWORD PTR SS:[EBP+0xC] 00410DF8 |.^ 7C EE \JL X7-不問少.00410DE8 00410DFA |. 5F POP EDI 00410DFB |> 5E POP ESI 00410DFC |. 5D POP EBP 00410DFD \. C3 RETN
//處理前
00411B30 3A 6D FC 6C 5F 15 45 AC 2E 7D 50 45 CF B8 6A 8B :m黮_E?}PE細j 00411B40 CC 19 B5 DA BC 5D C9 0C 51 D9 20 A0 C2 95 00 AD ?第糫?Q?犅? 00411B50 F7 A8 A6 AF 83 01 B5 58 D8 18 B8 C2 97 B8 3F 45 鱈Ο?礨?嘎椄?E 00411B60 49 59 D4 85 4B CD 02 51 45 44 C4 17 74 C8 01 41 IY詤K?QED?t?A 00411B70 62 98 31 4D 23 A6 03 15 AC F2 B6 AF BA CF 0C 41 b?M#?動合.A 00411B80 DD 08 B4 18 09 DD 08 9C C0 1C 80 CD 19 B9 D0 0D ??.?溊€?剮. 00411B90 9D CD 14 85 D9 18 A4 A1 EC 51 45 44 8F 1C AC 47 澩呝ぁ霶ED?珿 00411BA0 C9 04 51 DB 18 58 CA A2 40 CE 01 51 56 13 08 4C ?Q?X盛@?QVL 00411BB0 4A 98 D3 BE 54 C4 14 58 CE BC 46 1A 1D 4D 77 9B J樣綯?X渭FMw 00411BC0 78 05 A9 6F B0 62 98 4A 03 34 B5 D5 BA 30 45 D9 x﹐癰楯4嫡?E 00411BD0 61 89 05 0B 62 87 30 B3 C2 04 4C 76 8D C0 14 B8 a?b?陳Lv嵗 00411BE0 7C 09 99 56 DE F4 44 49 59 DB 38 9C 7A 99 10 CC |.橵摁DIY?渮? 00411BF0 39 A5 72 97 82 01 AD 5C 50 45 44 C0 1C 9C BA 31 9梻璡PED?満1 00411C00 AD DA AB 55 C9 0C 51 5F 06 01 41 5A 91 15 BB 3F 玌?Q_AZ?? 00411C10 5D AF 73 AC 7D AA AF BA CF 81 DA 94 55 7F 07 5D ]痵瑌合佢擴] 00411C20 24 25 CE 88 73 56 CD 43 3C 5C 63 9E 07 A2 5A 5F $%螆sV虲<\c?_ 00411C30 FB 9C CA 24 B8 45 CC 56 25 6E CE 01 85 5A 97 CC 麥?窫蘓%n?匷椞 00411C40 01 9D 6A AF 04 7F 07 5D 25 47 CF 47 56 EE 86 03 漥?]%G螱V顔 00411C50 D0 AE 2D A1 2E 4C 03 53 87 7F B1 2C B7 CE 39 A5 挾-?LS??肺9 00411C60 D3 91 6F 42 C1 5E 25 40 77 92 1A BB 46 4B F7 81 討oB羄%@w?籉K魛 00411C70 D3 28 90 48 D1 4F 30 8E 46 E7 5F CE 42 C3 5D 51 ?怘袿0嶧鏮蜝胅Q 00411C80 CD 43 C2 14 B8 04 03 C0 14 B8 CC 39 A5 62 1D 95 虲???柑9 00411C90 39 41 D2 0D 59 AD 2D A6 AF BA C9 0C A9 00 BA 31 9A?Y?Ο荷.?? 00411CA0 95 A6 25 9D AC 85 AB AF BA C7 8D 55 DD 00 9C C4 暒%潿叓菎U?溎 00411CB0 17 5C 15 AC 7D A3 AF BA 77 92 D1 0D B9 C9 04 81 \瑌/簑捬.股 00411CC0 B8 8C 46 49 59 D3 08 B8 B6 D4 1D 4D 17 23 58 B8 笇FIY?付?M#X 00411CD0 4A AA B6 A6 B8 D6 66 49 59 92 JΩ謋IY?.j.
//處理後
00411B30 6A 28 B8 25 06 45 00 E8 67 24 00 00 8B F1 33 DB j(?E.鑗$..嬹3 00411B40 89 5D FC 83 EC 18 8D 45 08 89 65 E4 8B CC 50 E8 塢鼉?岴塭鋴蘌 00411B50 B3 E1 FF FF C6 45 FC 01 88 5D FC 8B CE E8 7A 01 翅艵?圿鼖舞z 00411B60 00 00 84 C0 0F 84 5B 01 00 00 8D 4E 24 8D 45 08 ..劺刐..嶨$岴 00411B70 3B C8 74 09 6A FF 53 50 E8 BB EF FF FF 8B 45 18 ;萾.jSP杌?婨 00411B80 8D 4D F0 51 50 8D 4D D8 89 45 D0 88 5D F0 89 5D 峂餛P峂貕E袌]饓] 00411B90 D8 89 5D DC 89 5D E0 E8 B5 01 00 00 C6 45 FC 02 貕]軌]噼?..艵? 00411BA0 8D 4D 08 8B 5D 1C 83 FB 10 8B 45 18 0F 43 4D 08 峂媇凔婨CM 00411BB0 03 C1 83 FB 10 8D 4D 08 8B F8 0F 43 4D 08 33 D2 羶?峂孁CM3 00411BC0 21 55 EC 2B F9 3B C8 0F 47 7D EC 85 FF 74 0C 80 !U???G}靺t.€ 00411BD0 31 CC 41 42 3B D7 75 F7 8B 5D 1C 33 C9 89 4D E8 1藺B;譽鮦]3蓧M 00411BE0 39 4D D0 0F 8E B1 00 00 00 8B 7D D8 33 C0 40 89 9M?幈...媫?繞 00411BF0 7D EC 2B C7 C7 45 E4 05 00 00 00 89 45 CC FF 75 }?喬E?...塃?u 00411C00 E4 83 FB 10 8D 45 08 0F 43 45 08 03 C1 50 FF 76 鋬?岴CE罰v 00411C10 04 FF 36 E8 34 F3 FF FF 8B C8 83 C4 10 3B 4E 04 6??嬋兡;N 00411C20 74 60 8A C1 2A 06 88 07 75 05 33 DB 43 EB 03 0F t`娏*?u3跜? 00411C30 BE D8 83 7D E8 00 88 1F 7C 3E 8B 45 CC 03 C7 89 矩儅??|>婨?菈 00411C40 45 D4 33 FF 41 3B 4E 04 75 02 8B 0E 0F BE C3 47 E?A;Nu?久G 00411C50 99 F7 7D E4 6A 05 5A 03 C2 3B F8 75 E7 8B 7D EC 欦}鋔Z?鴘鐙} 00411C60 8A C1 2A 06 88 07 75 05 33 DB 43 EB 03 0F BE D8 娏*?u3跜?矩 00411C70 83 6D D4 01 88 1F 75 CA 0F BE 0F 8B 06 8A 04 01 僲??u???? 00411C80 88 07 8B 4D E8 41 47 89 4D E8 89 7D EC 3B 4D D0 ?婱鐰G塎鑹}?M 00411C90 7D 08 8B 5D 1C E9 64 FF FF FF 8D 45 F0 50 FF 75 }媇閐岴餚u 00411CA0 DC FF 75 D8 E8 CC F2 FF FF 83 C4 0C 8D 45 D8 8D ?u罔舔兡.岴貚 00411CB0 4E 0C 50 E8 34 FA FF FF 33 DB 88 5D FC 8D 4D D8 N.P??3蹐]鼚M 00411CC0 E8 C9 02 00 00 83 4D FC FF 8D 4D 08 53 6A 01 E8 梟..僊?峂Sj 00411CD0 0F EE FF FF E8 93 22 00 00 C2 ?钃"..?.j
//IDA -- 處理426位元組 char __cdecl sub_410DD6(int a1, signed int a2, int a3, signed int a4) { int v4; // ecx@1 signed int i; // esi@1 char result; // al@2 v4 = a1; for ( i = 0; i < a2; ++i ) { result = *(_BYTE *)(i % a4 + a3); *(_BYTE *)v4++ ^= result; } return result; } int __thiscall sub_40FD07(int this, int a2) { int v2; // esi@1 v2 = this; *(_DWORD *)(this + 20) = 15; *(_DWORD *)(this + 16) = 0; *(_BYTE *)this = 0; sub_410B38(a2, 0, -1); return v2; }
//繼續跟蹤主程式
00410518 6A 05 PUSH 0x5 0041051A 50 PUSH EAX 0041051B BB AA010000 MOV EBX,0x1AA 00410520 C745 E8 5045444>MOV DWORD PTR SS:[EBP-0x18],0x49444550 00410527 53 PUSH EBX 00410528 BF 301B4100 MOV EDI,7-不問少.00411B30 0041052D C645 EC 59 MOV BYTE PTR SS:[EBP-0x14],0x59 ; PEDIY 00410531 57 PUSH EDI 00410532 E8 9F080000 CALL 7-不問少.00410DD6 ; 用“PEDIY”作為金鑰,解密426位元組 00410537 51 PUSH ECX 00410538 51 PUSH ECX 00410539 8D85 68FFFFFF LEA EAX,DWORD PTR SS:[EBP-0x98] 0041053F 89A5 64FFFFFF MOV DWORD PTR SS:[EBP-0x9C],ESP 00410545 8BCC MOV ECX,ESP 00410547 50 PUSH EAX 00410548 E8 BAF7FFFF CALL 7-不問少.0040FD07 ; 字串複製 0041054D C645 FC 01 MOV BYTE PTR SS:[EBP-0x4],0x1 00410551 C645 FC 00 MOV BYTE PTR SS:[EBP-0x4],0x0 00410555 8D4E 40 LEA ECX,DWORD PTR DS:[ESI+0x40] 00410558 E8 D3150000 CALL 7-不問少.00411B30 ; Function2 0041055D 6A 05 PUSH 0x5 0041055F 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-0x18] 00410562 50 PUSH EAX 00410563 53 PUSH EBX 00410564 57 PUSH EDI 00410565 E8 6C080000 CALL 7-不問少.00410DD6 0041056A 83C4 10 ADD ESP,0x10 0041056D 8D4E 40 LEA ECX,DWORD PTR DS:[ESI+0x40] 00410570 E8 B0120000 CALL 7-不問少.00411825 ; check
三、分析演算法程式
//斷點410558,斷下後單步跟進 CALL 00411B30
00411BBA |. 0F434D 08 CMOVNB ECX,DWORD PTR SS:[EBP+0x8] ; 取input 00411BBE |. 33D2 XOR EDX,EDX 00411BC0 |. 2155 EC AND DWORD PTR SS:[EBP-0x14],EDX 00411BC3 |. 2BF9 SUB EDI,ECX ; 位數 00411BC5 |. 3BC8 CMP ECX,EAX 00411BC7 |. 0F477D EC CMOVA EDI,DWORD PTR SS:[EBP-0x14] ; 位數結束 00411BCB |. 85FF TEST EDI,EDI 00411BCD |. 74 0C JE X7-不問少.00411BDB 00411BCF |> 8031 CC /XOR BYTE PTR DS:[ECX],0xCC ; 將使用者輸入input[]每一位與0xCC異或 00411BD2 |. 41 |INC ECX 00411BD3 |. 42 |INC EDX 00411BD4 |. 3BD7 |CMP EDX,EDI 00411BD6 |.^ 75 F7 \JNZ X7-不問少.00411BCF 00411BD8 |. 8B5D 1C MOV EBX,DWORD PTR SS:[EBP+0x1C]
//Array1:(使用者輸入與0xCC異或後)
0068F9B0 8E BB A2 BF 8D B8 9C A9 A8 A5 B5 FE FC FD FB 87 幓⒖嵏湬ē疊麌 0068F9C0 94 F5 83 A7 00411BF4 |. C745 E4 05000>MOV DWORD PTR SS:[EBP-0x1C],0x5 ; 5 00411BFB |. 8945 CC MOV DWORD PTR SS:[EBP-0x34],EAX 00411BFE |> FF75 E4 /PUSH DWORD PTR SS:[EBP-0x1C] ; 5 00411C01 |. 83FB 10 |CMP EBX,0x10 00411C04 |. 8D45 08 |LEA EAX,DWORD PTR SS:[EBP+0x8] 00411C07 |. 0F4345 08 |CMOVNB EAX,DWORD PTR SS:[EBP+0x8] 00411C0B |. 03C1 |ADD EAX,ECX 00411C0D |. 50 |PUSH EAX ; xor_input 00411C0E |. FF76 04 |PUSH DWORD PTR DS:[ESI+0x4] 00411C11 |. FF36 |PUSH DWORD PTR DS:[ESI] ; 注意 [esi]
Array2:(64位元組)
00684C90 89 BC 95 FC FB BA ED 9A BB AE FE 99 A2 98 B9 F9 壖朁須劃郭 00684CA0 9F 84 9C FD 83 AD B6 A9 A5 F5 8C A7 9E 96 8A F4 焺滮儹訂ヵ導灃婔 00684CB0 85 BE A8 8F 86 AF 88 9D 87 BF FF A1 8B 81 A0 AB 吘◤啹垵嚳仩? 00684CC0 8E BD B5 AA 82 94 A4 8D A3 F8 B4 FA 9B A6 B8 80 幗氮倲x代洣竴
00411BFE |> /FF75 E4 /PUSH DWORD PTR SS:[EBP-0x1C] 00411C01 |. |83FB 10 |CMP EBX,0x10 00411C04 |. |8D45 08 |LEA EAX,DWORD PTR SS:[EBP+0x8] 00411C07 |. |0F4345 08 |CMOVNB EAX,DWORD PTR SS:[EBP+0x8] 00411C0B |. |03C1 |ADD EAX,ECX 00411C0D |. |50 |PUSH EAX 00411C0E |. |FF76 04 |PUSH DWORD PTR DS:[ESI+0x4] 00411C11 |. |FF36 |PUSH DWORD PTR DS:[ESI] 00411C13 |. |E8 34F3FFFF |CALL 7-不問少.00410F4C ; Array1 逐位搜尋在 Array2 中的位置 00411C18 |. |8BC8 |MOV ECX,EAX 00411C1A |. |83C4 10 |ADD ESP,0x10 00411C1D |. |3B4E 04 |CMP ECX,DWORD PTR DS:[ESI+0x4] ; 不超出陣列下限 00411C20 |. |74 60 |JE X7-不問少.00411C82 00411C22 |. |8AC1 |MOV AL,CL 00411C24 |. |2A06 |SUB AL,BYTE PTR DS:[ESI] ; Array2 下標,如果索引超出下標就回頭,類似一個環 00411C26 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00411C28 |. |75 05 |JNZ X7-不問少.00411C2F 00411C2A |. |33DB |XOR EBX,EBX 00411C2C |. |43 |INC EBX 00411C2D |. |EB 03 |JMP X7-不問少.00411C32 00411C2F |> |0FBED8 |MOVSX EBX,AL 00411C32 |> |837D E8 00 |CMP DWORD PTR SS:[EBP-0x18],0x0 ; 計數器 00411C36 |. |881F |MOV BYTE PTR DS:[EDI],BL 00411C38 |. |7C 3E |JL X7-不問少.00411C78 00411C3A |. |8B45 CC |MOV EAX,DWORD PTR SS:[EBP-0x34] 00411C3D |. |03C7 |ADD EAX,EDI 00411C3F |. |8945 D4 |MOV DWORD PTR SS:[EBP-0x2C],EAX ; 小迴圈次數 00411C42 |> |33FF |/XOR EDI,EDI 00411C44 |> |41 ||/INC ECX 00411C45 |. |3B4E 04 |||CMP ECX,DWORD PTR DS:[ESI+0x4] 00411C48 |. |75 02 |||JNZ X7-不問少.00411C4C 00411C4A |. |8B0E |||MOV ECX,DWORD PTR DS:[ESI] 00411C4C |> |0FBEC3 |||MOVSX EAX,BL ; 最近一次匹中Array2的下標 00411C4F |. |47 |||INC EDI 00411C50 |. |99 |||CDQ 00411C51 |. |F77D E4 |||IDIV DWORD PTR SS:[EBP-0x1C] 00411C54 |. |6A 05 |||PUSH 0x5 00411C56 |. |5A |||POP EDX 00411C57 |. |03C2 |||ADD EAX,EDX 00411C59 |. |3BF8 |||CMP EDI,EAX 00411C5B |.^|75 E7 ||\JNZ X7-不問少.00411C44 ; 小間隔定位 00411C5D |. |8B7D EC ||MOV EDI,DWORD PTR SS:[EBP-0x14] 00411C60 |. |8AC1 ||MOV AL,CL 00411C62 |. |2A06 ||SUB AL,BYTE PTR DS:[ESI] ; Array2 下標 (小間隔) 00411C64 |. |8807 ||MOV BYTE PTR DS:[EDI],AL ; 就是個索引演算法,詳細見附件Python 00411C66 |. |75 05 ||JNZ X7-不問少.00411C6D 00411C68 |. |33DB ||XOR EBX,EBX 00411C6A |. |43 ||INC EBX 00411C6B |. |EB 03 ||JMP X7-不問少.00411C70 00411C6D |> |0FBED8 ||MOVSX EBX,AL 00411C70 |> |836D D4 01 ||SUB DWORD PTR SS:[EBP-0x2C],0x1 ; 小間隔迴圈次數 00411C74 |. |881F ||MOV BYTE PTR DS:[EDI],BL 00411C76 |.^|75 CA |\JNZ X7-不問少.00411C42 00411C78 |> |0FBE0F |MOVSX ECX,BYTE PTR DS:[EDI] 00411C7B |. |8B06 |MOV EAX,DWORD PTR DS:[ESI] 00411C7D |. |8A0401 |MOV AL,BYTE PTR DS:[ECX+EAX] 00411C80 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00411C82 |> |8B4D E8 |MOV ECX,DWORD PTR SS:[EBP-0x18] 00411C85 |. |41 |INC ECX 00411C86 |. |47 |INC EDI 00411C87 |. |894D E8 |MOV DWORD PTR SS:[EBP-0x18],ECX 00411C8A |. |897D EC |MOV DWORD PTR SS:[EBP-0x14],EDI 00411C8D |. |3B4D D0 |CMP ECX,DWORD PTR SS:[EBP-0x30] ; 位數 00411C90 |. |7D 08 |JGE X7-不問少.00411C9A 00411C92 |. |8B5D 1C |MOV EBX,DWORD PTR SS:[EBP+0x1C] 00411C95 |.^\E9 64FFFFFF \JMP 7-不問少.00411BFE
//在Array2環中索引查詢結果
//Array3:
001D29B8 B8 AD AF 9C 9D BB 85 BF F9 BB BE 99 B8 A1 9C 99 腑瘻澔吙緳浮湙 001D29C8 8C 85 9A A4 寘殼B.
//對Array3再次異或、移位、與等加密,結果還是更新到Array3中
00411C9D |. 50 PUSH EAX 00411C9E |. FF75 DC PUSH DWORD PTR SS:[EBP-0x24] 00411CA1 |. FF75 D8 PUSH DWORD PTR SS:[EBP-0x28] 00411CA4 |. E8 CCF2FFFF CALL 7-不問少.00410F75 ; Array3 異或 移位 與 等,結果還是存到 Array3 char __cdecl sub_410F75(unsigned int arrary3, unsigned int a2) { unsigned int arrary3_; // edx@1 char result; // al@1 int len; // esi@1 int i; // edi@1 arrary3_ = arrary3; result = 0; len = a2 - arrary3; i = 0; if ( arrary3 > a2 ) len = 0; if ( len ) { do { result = 8 * (*(_BYTE *)arrary3_ ^ 0xCC) | ((char)(*(_BYTE *)arrary3_ ^ 0xCC) >> 5); *(_BYTE *)arrary3_++ = result; ++i; } while ( i != len ); } return result; }
//加密後的Array3
001D29B8 A3 0B 1B 82 8A BB 4A 9B A9 BB 93 AA A3 6B 82 AA ?倞籎洨粨k偑 001D29C8 02 4A B2 43 J睠B
四、分析驗證程式
//返回主程式
0041055D |. 6A 05 PUSH 0x5 0041055F |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-0x18] 00410562 |. 50 PUSH EAX 00410563 |. 53 PUSH EBX 00410564 |. 57 PUSH EDI 00410565 |. E8 6C080000 CALL 7-不問少.00410DD6 ; 用“PEDIY”作金鑰,處理426位元組 char __cdecl sub_410DD6(int Array3, signed int len_426, int miyao, signed int div_5) { int Array3_; // ecx@1 signed int i; // esi@1 char result; // al@2 Array3_ = Array3; for ( i = 0; i < len_426; ++i ) { result = *(_BYTE *)(i % div_5 + miyao); *(_BYTE *)Array3_++ ^= result; } return result; } 0012FA8C 00411B30 入口地址 0012FA90 000001AA 0012FA94 0012FB30 0012FA98 00000005
//加密“CALL 00411B30”對應主演算法流程的426位元組,主演算法程式加密掉,理念不錯,用完棄之!
00411B30 3A 6D FC 6C 5F 15 45 AC 2E 7D 50 45 CF B8 6A 8B :m黮_E?}PE細j? 00411B40 CC 19 B5 DA BC 5D C9 0C 51 D9 20 A0 C2 95 00 AD ?第糫?Q?犅?? 00411B50 F7 A8 A6 AF 83 01 B5 58 D8 18 B8 C2 97 B8 3F 45 鱈Ο?礨?嘎椄?E 00411B60 49 59 D4 85 4B CD 02 51 45 44 C4 17 74 C8 01 41 IY詤K?QED?t?A 00411B70 62 98 31 4D 23 A6 03 15 AC F2 B6 AF BA CF 0C 41 b?M#?動合.A 00411B80 DD 08 B4 18 09 DD 08 9C C0 1C 80 CD 19 B9 D0 0D ??.?溊€?剮. 00411B90 9D CD 14 85 D9 18 A4 A1 EC 51 45 44 8F 1C AC 47 澩呝ぁ霶ED?珿 00411BA0 C9 04 51 DB 18 58 CA A2 40 CE 01 51 56 13 08 4C ?Q?X盛@?QVL 00411BB0 4A 98 D3 BE 54 C4 14 58 CE BC 46 1A 1D 4D 77 9B J樣綯?X渭FMw? 00411BC0 78 05 A9 6F B0 62 98 4A 03 34 B5 D5 BA 30 45 D9 x﹐癰楯4嫡?E? 00411BD0 61 89 05 0B 62 87 30 B3 C2 04 4C 76 8D C0 14 B8 a?b?陳Lv嵗? 00411BE0 7C 09 99 56 DE F4 44 49 59 DB 38 9C 7A 99 10 CC |.橵摁DIY?渮?? 00411BF0 39 A5 72 97 82 01 AD 5C 50 45 44 C0 1C 9C BA 31 9梻璡PED?満1 00411C00 AD DA AB 55 C9 0C 51 5F 06 01 41 5A 91 15 BB 3F 玌?Q_AZ?? 00411C10 5D AF 73 AC 7D AA AF BA CF 81 DA 94 55 7F 07 5D ]痵瑌合佢擴] 00411C20 24 25 CE 88 73 56 CD 43 3C 5C 63 9E 07 A2 5A 5F $%螆sV虲<\c?_ 00411C30 FB 9C CA 24 B8 45 CC 56 25 6E CE 01 85 5A 97 CC 麥?窫蘓%n?匷椞 00411C40 01 9D 6A AF 04 7F 07 5D 25 47 CF 47 56 EE 86 03 漥?]%G螱V顔 00411C50 D0 AE 2D A1 2E 4C 03 53 87 7F B1 2C B7 CE 39 A5 挾-?LS??肺9? 00411C60 D3 91 6F 42 C1 5E 25 40 77 92 1A BB 46 4B F7 81 討oB羄%@w?籉K魛 00411C70 D3 28 90 48 D1 4F 30 8E 46 E7 5F CE 42 C3 5D 51 ?怘袿0嶧鏮蜝胅Q 00411C80 CD 43 C2 14 B8 04 03 C0 14 B8 CC 39 A5 62 1D 95 虲???柑9? 00411C90 39 41 D2 0D 59 AD 2D A6 AF BA C9 0C A9 00 BA 31 9A?Y?Ο荷.?? 00411CA0 95 A6 25 9D AC 85 AB AF BA C7 8D 55 DD 00 9C C4 暒%潿叓菎U?溎 00411CB0 17 5C 15 AC 7D A3 AF BA 77 92 D1 0D B9 C9 04 81 \瑌/簑捬.股? 00411CC0 B8 8C 46 49 59 D3 08 B8 B6 D4 1D 4D 17 23 58 B8 笇FIY?付?M#X? 00411CD0 4A AA B6 A6 B8 D6 66 49 59 92 JΩ謋IY?.j.
//CHECK,跟進 CALL 00411825
0041056D |. 8D4E 40 LEA ECX,DWORD PTR DS:[ESI+0x40] 00410570 |. E8 B0120000 CALL 7-不問少.00411825 ; check
//檢驗Array3是否滿足,如果不滿足就不進行後續SMC解碼
00411825 $ 6A 18 PUSH 0x18 00411827 . B8 4A054500 MOV EAX,7-不問少.0045054A 0041182C . E8 DD270000 CALL 7-不問少.0041400E 00411831 . 894D E4 MOV DWORD PTR SS:[EBP-0x1C],ECX 00411834 . E8 3C010000 CALL 7-不問少.00411975 ; 檢驗Array3是否滿足,如果不滿足就不進行後續SMC解碼 00411839 . 84C0 TEST AL,AL 0041183B . 0F84 D8000000 JE 7-不問少.00411919
//再跟進 CALL 00411975
004119D2 |. 6A 28 PUSH 0x28 004119D4 |. E8 A2040000 CALL 7-不問少.00411E7B 004119D9 |. 85FF TEST EDI,EDI ; 40位 004119DB |. 7E 54 JLE X7-不問少.00411A31 004119E7 |. |0F4345 D8 |CMOVNB EAX,DWORD PTR SS:[EBP-0x28] ; Array3 轉為 字串 Array4 004119EB |. |03C3 |ADD EAX,EBX 004119ED |. |50 |PUSH EAX 004119EE |. |FF75 B0 |PUSH DWORD PTR SS:[EBP-0x50] 004119F1 |. |FF75 AC |PUSH DWORD PTR SS:[EBP-0x54] 004119F4 |. |E8 53F5FFFF |CALL 7-不問少.00410F4C ; 按十六進位制轉數值 004119F9 |. |2A45 AC |SUB AL,BYTE PTR SS:[EBP-0x54] 004119FC >|. |83C4 10 |ADD ESP,0x10 004119FF |. |0FBEC8 |MOVSX ECX,AL 00411A02 |. |8BC1 |MOV EAX,ECX 00411A04 |. |99 |CDQ 00411A05 |. |83E2 03 |AND EDX,0x3 00411A08 |. |03C2 |ADD EAX,EDX 00411A0A |. |C1F8 02 |SAR EAX,0x2 ; 儲存商 00411A0D |. |8845 C4 |MOV BYTE PTR SS:[EBP-0x3C],AL ; *(_BYTE *)(a1 - 0x3C) = (char)(v8 - *(_BYTE *)(a1 - 0x54)) / 4; 00411A10 |. |81E1 03000080 |AND ECX,0x80000003 ; 0,1,2 00411A16 |. |79 05 |JNS X7-不問少.00411A1D 00411A18 |. |49 |DEC ECX 00411A19 |. |83C9 FC |OR ECX,0xFFFFFFFC 00411A1C |. |41 |INC ECX 00411A1D |> |8D45 C4 |LEA EAX,DWORD PTR SS:[EBP-0x3C] ; 儲存餘數 00411A20 |. |884D C5 |MOV BYTE PTR SS:[EBP-0x3B],CL ; *(_BYTE *)(a1 - 0x3B) = (char)(v8 - *(_BYTE *)(a1 - 0x54)) % 4; 00411A23 >|. |50 |PUSH EAX 00411A24 |. |8D4D B8 |LEA ECX,DWORD PTR SS:[EBP-0x48] 00411A27 |. |E8 06070000 |CALL 7-不問少.00412132 ; 轉存校驗值,打亂地址 00411A2C |. |43 |INC EBX 00411A2D |. |3BDF |CMP EBX,EDI 00411A2F |.^\7C AC \JL X7-不問少.004119DD 004119DD |> /837D EC 10 /CMP DWORD PTR SS:[EBP-0x14],0x10 004119E1 |. |8D45 D8 |LEA EAX,DWORD PTR SS:[EBP-0x28] 004119E4 |. |FF75 C4 |PUSH DWORD PTR SS:[EBP-0x3C] 004119E7 |. |0F4345 D8 |CMOVNB EAX,DWORD PTR SS:[EBP-0x28] ; Array3 轉為 字串
//Array3 未轉換之前:
001D29B8 A3 0B 1B 82 8A BB 4A 9B A9 BB 93 AA A3 6B 82 AA ?倞籎洨粨k偑 001D29C8 02 4A B2 43 J睠B
//索引表,字串、十六進位制轉換:
0012FA20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0123456789ABCDEF
//Array3轉為字串Array4 "A30B1B828ABB4A9BA9BB93AAA36B82AA024AB243"
//確定輸入位數20位,這裡才能達到80(0x50),異或後為0才能觸發跳轉
00411A31 8B4E 1C MOV ECX,DWORD PTR DS:[ESI+0x1C] 00411A34 8B45 BC MOV EAX,DWORD PTR SS:[EBP-0x44] 00411A37 2B4E 18 SUB ECX,DWORD PTR DS:[ESI+0x18] ; 0x50 0x50 00411A3A 2B45 B8 SUB EAX,DWORD PTR SS:[EBP-0x48] ; 0x24 0x50 00411A3D 33C8 XOR ECX,EAX ; 0x74 0x0 00411A3F F7C1 FEFFFFFF TEST ECX,0xFFFFFFFE 00411A45 74 04 JE X7-不問少.00411A4B
//IDA int __usercall sub_411975@(int a1@) { int v1; // ecx@1 int v2; // esi@1 int v3; // ebx@1 int v4; // edi@1 int v5; // ST0C_4@1 int v6; // eax@2 int v7; // ST0C_4@2 char v8; // al@4 signed int v9; // ecx@4 sub_413FD7(72); v2 = v1; sub_41191F(a1 - 40); v3 = 0; *(_DWORD *)(a1 - 4) = 0; v4 = *(_DWORD *)(a1 - 24); *(_BYTE *)(a1 - 60) = 0; v5 = *(_DWORD *)(a1 - 60); *(_OWORD *)(a1 - 56) = xmmword_403D50; *(_DWORD *)(a1 - 84) = 0; *(_DWORD *)(a1 - 80) = 0; *(_DWORD *)(a1 - 76) = 0; sub_410E2D(a1 - 56, a1 - 40, v5); *(_BYTE *)(a1 - 4) = 1; *(_DWORD *)(a1 - 72) = 0; *(_DWORD *)(a1 - 68) = 0; *(_DWORD *)(a1 - 64) = 0; *(_BYTE *)(a1 - 4) = 2; sub_411E7B(40); if ( v4 > 0 ) { do { v6 = a1 - 40; v7 = *(_DWORD *)(a1 - 60); if ( *(_DWORD *)(a1 - 20) >= 0x10u ) v6 = *(_DWORD *)(a1 - 40); v8 = sub_410F4C(*(_DWORD *)(a1 - 84), *(_DWORD *)(a1 - 80), v3 + v6); v9 = (char)(v8 - *(_BYTE *)(a1 - 84)); *(_BYTE *)(a1 - 60) = (char)(v8 - *(_BYTE *)(a1 - 84)) / 4; *(_BYTE *)(a1 - 59) = v9 % 4; sub_412132(a1 - 60); ++v3; } while ( v3 < v4 ); } if ( !(((*(_DWORD *)(a1 - 68) - *(_DWORD *)(a1 - 72)) ^ (*(_DWORD *)(v2 + 28) - *(_DWORD *)(v2 + 24))) & 0xFFFFFFFE) ) sub_41612A(*(_DWORD *)(v2 + 24), *(_DWORD *)(a1 - 72), 2 * ((*(_DWORD *)(v2 + 28) - *(_DWORD *)(v2 + 24)) >> 1)); *(_BYTE *)(a1 - 4) = 1; sub_411FB4(a1 - 72); *(_BYTE *)(a1 - 4) = 0; sub_411F8E(a1 - 84); *(_DWORD *)(a1 - 4) = -1; sub_410AE3(1, 0); return sub_413F81(); }
//目的是為了將Array4每個字母作為十六進位制數進行除以4,取商和餘數變形,阻止破解者輕易理解演算法,藏得好辛苦,作者辛苦了!
//下記錄斷點,檢視40組變形結果
Breakpoints 地址 模組 啟用 反彙編 註釋 004119FC 7-不問少 Log "十六進位制" ADD ESP,0x10 00411A23 7-不問少 Log "轉換為校驗值" PUSH EAX
Log data 地址 訊息 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 03 00411A23 COND: 轉換為校驗值 = 00000300 004119FC COND: 十六進位制 = 00 00411A23 COND: 轉換為校驗值 = 00000000 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 01 00411A23 COND: 轉換為校驗值 = 00000100 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 08 00411A23 COND: 轉換為校驗值 = 00000002 004119FC COND: 十六進位制 = 02 00411A23 COND: 轉換為校驗值 = 00000200 004119FC COND: 十六進位制 = 08 00411A23 COND: 轉換為校驗值 = 00000002 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 04 00411A23 COND: 轉換為校驗值 = 00000001 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 09 00411A23 COND: 轉換為校驗值 = 00000102 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 09 00411A23 COND: 轉換為校驗值 = 00000102 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 09 00411A23 COND: 轉換為校驗值 = 00000102 004119FC COND: 十六進位制 = 03 00411A23 COND: 轉換為校驗值 = 00000300 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 03 00411A23 COND: 轉換為校驗值 = 00000300 004119FC COND: 十六進位制 = 06 00411A23 COND: 轉換為校驗值 = 00000201 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 08 00411A23 COND: 轉換為校驗值 = 00000002 004119FC COND: 十六進位制 = 02 00411A23 COND: 轉換為校驗值 = 00000200 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 00 00411A23 COND: 轉換為校驗值 = 00000000 004119FC COND: 十六進位制 = 02 00411A23 COND: 轉換為校驗值 = 00000200 004119FC COND: 十六進位制 = 04 00411A23 COND: 轉換為校驗值 = 00000001 004119FC COND: 十六進位制 = 0A 00411A23 COND: 轉換為校驗值 = 00000202 004119FC COND: 十六進位制 = 0B 00411A23 COND: 轉換為校驗值 = 00000302 004119FC COND: 十六進位制 = 02 00411A23 COND: 轉換為校驗值 = 00000200 004119FC COND: 十六進位制 = 04 00411A23 COND: 轉換為校驗值 = 00000001 004119FC COND: 十六進位制 = 03 00411A23 COND: 轉換為校驗值 = 00000300
//找到要比較的表,必須相同
00416164 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+0x8] ; Default case of switch 00416134
//正確值
0029C788 0202 0300 0000 0302 0100 0302 0002 0200 0029C798 0002 0202 0302 0302 0001 0202 0102 0302 0029C7A8 0202 0102 0302 0302 0102 0300 0202 0202 0029C7B8 0202 0300 0201 0302 0002 0200 0202 0202 0029C7C8 0000 0200 0001 0202 0302 0200 0001 0300
//Array4校驗值
002A4F00 0202 0300 0000 0302 0100 0302 0002 0200 002A4F10 0002 0202 0302 0302 0001 0202 0102 0302 002A4F20 0202 0102 0302 0302 0102 0300 0202 0202 002A4F30 0202 0300 0201 0302 0002 0200 0202 0202 002A4F40 0000 0200 0001 0202 0302 0200 0001 0300
00416171 |> /8B06 /MOV EAX,DWORD PTR DS:[ESI] 00416173 |. |3B02 |CMP EAX,DWORD PTR DS:[EDX] ; 比較第1、2位;17、18位; 00416175 |. |0F84 80000000 |JE 7-不問少.004161FB ; 必須跳 00416205 |. 8B46 04 |MOV EAX,DWORD PTR DS:[ESI+0x4] 00416208 |. 3B42 04 |CMP EAX,DWORD PTR DS:[EDX+0x4] ; 比較第3、4位;19、20位; 0041620B |. 74 7F |JE X7-不問少.0041628C ; 必須跳 00416296 |. 8B46 08 |MOV EAX,DWORD PTR DS:[ESI+0x8] 00416299 |. 3B42 08 |CMP EAX,DWORD PTR DS:[EDX+0x8] ; 比較第5、6位;21、22位; 0041629C |. 74 7F |JE X7-不問少.0041631D ; 必須跳 00416327 |. 8B46 0C |MOV EAX,DWORD PTR DS:[ESI+0xC] 0041632A |. 3B42 0C |CMP EAX,DWORD PTR DS:[EDX+0xC] ; 比較第7、8位;23、24位; 0041632D |. 74 7F |JE X7-不問少.004163AE ; 必須跳 004163B8 |. 8B46 10 |MOV EAX,DWORD PTR DS:[ESI+0x10] 004163BB |. 3B42 10 |CMP EAX,DWORD PTR DS:[EDX+0x10] ; 比較第9、10位;25、26位; 004163BE |. 0F84 80000000 |JE 7-不問少.00416444 ; 必須跳 0041644E |. 8B46 14 |MOV EAX,DWORD PTR DS:[ESI+0x14] 00416451 |. 3B42 14 |CMP EAX,DWORD PTR DS:[EDX+0x14] ; 比較第11、12位;27、28位; 00416454 |. 74 7F |JE X7-不問少.004164D5 ; 必須跳 004164DF |. 8B46 18 |MOV EAX,DWORD PTR DS:[ESI+0x18] 004164E2 |. 3B42 18 |CMP EAX,DWORD PTR DS:[EDX+0x18] ; 比較第13、14位;29、30位; 004164E5 |. 74 7F |JE X7-不問少.00416566 ; 必須跳 00416570 |. 8B46 1C |MOV EAX,DWORD PTR DS:[ESI+0x1C] 00416573 |. 3B42 1C |CMP EAX,DWORD PTR DS:[EDX+0x1C] ; 比較第15、16位;31、32位; 00416576 |. 74 7F |JE X7-不問少.004165F7 ; 必須跳 004167EB |> \8B46 F0 MOV EAX,DWORD PTR DS:[ESI-0x10] ; Case 10 of switch 00416616 004167EE |. 3B42 F0 CMP EAX,DWORD PTR DS:[EDX-0x10] ; 比較第33、34位; 004167F1 |. 0F84 81000000 JE 7-不問少.00416878 ; 必須跳 00416882 |> \8B46 F4 MOV EAX,DWORD PTR DS:[ESI-0xC] ; Case C of switch 00416616 00416885 |. 3B42 F4 CMP EAX,DWORD PTR DS:[EDX-0xC] ; 比較第35、36位; 00416888 |. 0F84 82000000 JE 7-不問少.00416910 ; 必須跳 0041691A |> \8B46 F8 MOV EAX,DWORD PTR DS:[ESI-0x8] ; Case 8 of switch 00416616 0041691D |. 3B42 F8 CMP EAX,DWORD PTR DS:[EDX-0x8] ; 比較第37、38位; 00416920 |. 0F84 81000000 JE 7-不問少.004169A7 ; 必須跳 004169B1 |> \8B46 FC MOV EAX,DWORD PTR DS:[ESI-0x4] ; Case 4 of switch 00416616 004169B4 |. 3B42 FC CMP EAX,DWORD PTR DS:[EDX-0x4] ; 比較第39、40位; 004169B7 |. 74 75 JE X7-不問少.00416A2E ; 必須跳
//演算法破解思路:
//根據40位校驗值按“4的倍數+餘數”,求出40個字元Array4,然後轉Array3,再進行20位字串,逐位窮舉,限定合法字元
五、分析關鍵CHECK的SMC解碼程式(隱含註冊碼篩選要求)
//返回到上級程式,分析後續SMC過程
//申請記憶體4096位元組,用於SMC,這種方法可取,防止爆破和靜態分析
00411841 . 6A 40 PUSH 0x40 ; /Protect = PAGE_EXECUTE_READWRITE 00411843 . BB 00100000 MOV EBX,0x1000 ; | 00411848 . 53 PUSH EBX ; |AllocationType => MEM_COMMIT 00411849 . 53 PUSH EBX ; |Size => 1000 (4096.) 0041184A . 33F6 XOR ESI,ESI ; | 0041184C . 56 PUSH ESI ; |Address => NULL 0041184D . FF15 583C4500 CALL DWORD PTR DS:[] ; \VirtualAlloc
//待解碼資料複製
00411858 . 68 94000000 PUSH 0x94 0041185D . 68 9C1A4100 PUSH 7-不問少.00411A9C 00411862 . 53 PUSH EBX 00411863 . 57 PUSH EDI 00411864 . E8 84090000 CALL 7-不問少.004121ED ; 從411A9C複製0x94位元組到新申請的記憶體中 00411869 . 83C4 10 ADD ESP,0x10
//源:
00411A9C 17 FC 82 19 BE 1C B8 60 21 69 1D 93 30 31 37 4B 鼈?竊!i?17K 00411AAC 08 BA A3 4F E3 F3 6A 33 41 47 95 EC 21 99 29 BF 海O泱j3AG曥!? 00411ABC 75 C5 53 E8 58 39 4F 6B C1 12 B6 73 CC 31 88 35 u臩鑈9Ok?秙?? 00411ACC E9 24 A5 F5 75 ED 75 1C 16 6A 1E E6 07 9A A9 36 ?ヵu韚j?毄6 00411ADC A1 61 62 47 5B 39 F4 77 D0 F6 72 AF 3A 0A 6E 56 bG[9魒婿r?.nV 00411AEC 12 FA 2B A3 86 31 B8 42 12 1D 03 62 F6 74 DB 09 ?1窧b鰐? 00411AFC B0 2B B9 94 BD F4 AA 67 CC 31 B0 0F 24 01 64 0F ?箶緊猤??$d 00411B0C 70 31 67 21 58 C6 5A 9B 7F 32 6E F8 0C 80 34 EC p1g!X芞?2n?€4 00411B1C 69 69 79 32 30 68 BC 06 A8 0A 82 83 6D 53 6E 73 iiy20h??們mSns 00411B2C CA 91 0D A6 蕬.?m
//目的:
00EC0000 17 FC 82 19 BE 1C B8 60 21 69 1D 93 30 31 37 4B 鼈?竊!i?17K 00EC0010 08 BA A3 4F E3 F3 6A 33 41 47 95 EC 21 99 29 BF 海O泱j3AG曥!? 00EC0020 75 C5 53 E8 58 39 4F 6B C1 12 B6 73 CC 31 88 35 u臩鑈9Ok?秙?? 00EC0030 E9 24 A5 F5 75 ED 75 1C 16 6A 1E E6 07 9A A9 36 ?ヵu韚j?毄6 00EC0040 A1 61 62 47 5B 39 F4 77 D0 F6 72 AF 3A 0A 6E 56 bG[9魒婿r?.nV 00EC0050 12 FA 2B A3 86 31 B8 42 12 1D 03 62 F6 74 DB 09 ?1窧b鰐? 00EC0060 B0 2B B9 94 BD F4 AA 67 CC 31 B0 0F 24 01 64 0F ?箶緊猤??$d 00EC0070 70 31 67 21 58 C6 5A 9B 7F 32 6E F8 0C 80 34 EC p1g!X芞?2n?€4 00EC0080 69 69 79 32 30 68 BC 06 A8 0A 82 83 6D 53 6E 73 iiy20h??們mSns 00EC0090 CA 91 0D A6 蕬.?.
//SMC解碼,異或
0041187A > /81FE 94000000 CMP ESI,0x94 ; 0x94 迴圈條件 (148) 00411880 . |7D 27 JGE X7-不問少.004118A9 00411882 . |8BC6 MOV EAX,ESI 00411884 . |33D2 XOR EDX,EDX 00411886 . |F771 34 DIV DWORD PTR DS:[ECX+0x34] ; % 0x14 00411889 . |46 INC ESI ; +1 0041188A . |8975 E0 MOV DWORD PTR SS:[EBP-0x20],ESI ; 計數器 0041188D . |8D41 24 LEA EAX,DWORD PTR DS:[ECX+0x24] 00411890 . |8378 14 10 CMP DWORD PTR DS:[EAX+0x14],0x10 00411894 . |72 02 JB X7-不問少.00411898 00411896 . |8B00 MOV EAX,DWORD PTR DS:[EAX] ; 取input 00411898 > |8A0410 MOV AL,BYTE PTR DS:[EAX+EDX] ; 逐位取input 0041189B . |8B55 EC MOV EDX,DWORD PTR SS:[EBP-0x14] 0041189E . |3002 XOR BYTE PTR DS:[EDX],AL ; 異或 004118A0 . |42 INC EDX ; +1 004118A1 . |8955 EC MOV DWORD PTR SS:[EBP-0x14],EDX 004118A4 . |8955 DC MOV DWORD PTR SS:[EBP-0x24],EDX 004118A7 .^\EB D1 JMP X7-不問少.0041187A 004118A9 > 8B41 34 MOV EAX,DWORD PTR DS:[ECX+0x34] 004118B8 . 8B09 MOV ECX,DWORD PTR DS:[ECX] ; input 004118BA > 8BC6 MOV EAX,ESI 004118BC . 33D2 XOR EDX,EDX 004118BE . F775 E4 DIV DWORD PTR SS:[EBP-0x1C] ; 0x94 % 0x14 = 0x8 004118C1 . 8A040A MOV AL,BYTE PTR DS:[EDX+ECX] ; 取input第8位 004118C4 . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-0x14] 004118C7 . 3001 XOR BYTE PTR DS:[ECX],AL ; 用input第8位解密 004118C9 . 8D4F 60 LEA ECX,DWORD PTR DS:[EDI+0x60] 004118CC . BA 9C1A4100 MOV EDX,7-不問少.00411A9C 004118D1 . 8BC2 MOV EAX,EDX 004118D3 . 2BC1 SUB EAX,ECX 004118D5 . 83C0 60 ADD EAX,0x60 004118D8 . 0141 01 ADD DWORD PTR DS:[ECX+0x1],EAX 004118DB . 8D8F 8B000000 LEA ECX,DWORD PTR DS:[EDI+0x8B] 004118E1 . 8B41 01 MOV EAX,DWORD PTR DS:[ECX+0x1] 004118E4 . 2BC1 SUB EAX,ECX 004118E6 . 81C2 8B000000 ADD EDX,0x8B 004118EC . 03C2 ADD EAX,EDX 004118EE . 8941 01 MOV DWORD PTR DS:[ECX+0x1],EAX ; 解密
六、演算法破解
//1、根據40位校驗值按“4的倍數+餘數”,求出40個字元Array4,然後轉Array3,再進行20位字串,逐位窮舉,限定合法字元
//Python
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Ctf.pediy.com ctf2017 crackme 7 keygen # python 3.6.0 32bit # written by 愛琴海 # 2017/06/14 def Main(): #跟破文對應,窮舉20位合規字元註冊碼 Array2 = [0x89,0xBC,0x95,0xFC,0xFB,0xBA,0xED,0x9A,0xBB,0xAE,0xFE,0x99,0xA2,0x98,0xB9,0xF9,0x9F,0x84,0x9C,0xFD, 0x83,0xAD,0xB6,0xA9,0xA5,0xF5,0x8C,0xA7,0x9E,0x96,0x8A,0xF4,0x85,0xBE,0xA8,0x8F,0x86,0xAF,0x88,0x9D,0x87,0xBF, 0xFF,0xA1,0x8B,0x81,0xA0,0xAB,0x8E,0xBD,0xB5,0xAA,0x82,0x94,0xA4,0x8D,0xA3,0xF8,0xB4,0xFA,0x9B,0xA6,0xB8,0x80] Array3 = [0xA3,0x0B,0x1B,0x82,0x8A,0xBB,0x4A,0x9B,0xA9,0xBB,0x93,0xAA,0xA3,0x6B,0x82,0xAA,0x02,0x4A,0xB2,0x43] for n in range (0x0,len(Array3)): #窮舉20位輸入 for sn in range(0x30,0x7B): #字串範圍縮小一些,還可以繼續縮小,速度夠快,想想沒必要了,如果顯示結果非字母數字則忽略即可 sn1 = sn ^ 0xCC if sn1 in Array2: Start1 = Array2.index(sn1) Element_new = Search(Array2,Start1,n) if Array3[n] == (((Element_new ^ 0xCC) > 0x5)) & 0xFF: print ('第 %d 位' % (n+1),chr(sn)) return def Search(Array,Start,Count): #Start、Count下標均從0開始,跟上層呼叫保持一致 #Count為0-19,也就是陣列下標 #Start為上層匹配Array2的下標 for i in range(0,Count+1): n = Start // 5 + 5 Start = (Start + n) % len(Array) return Array[Start] if __name__ == '__main__': #呼叫演算法程式 Main()
//窮舉合法字元註冊碼如下:第1、3、11、19位只有唯一解,而其他位都存在好幾個解,為了進一步篩選註冊碼,需要分析SMC解碼
第 1 位 B 第 2 位 j 第 2 位 w 第 3 位 n 第 4 位 d 第 4 位 s 第 5 位 A 第 5 位 Y 第 5 位 l 第 6 位 b 第 6 位 t 第 7 位 P 第 7 位 i 第 8 位 H 第 8 位 e 第 9 位 c 第 9 位 d 第 9 位 s 第 10 位 P 第 10 位 i 第 11 位 y 第 12 位 2 第 12 位 5 第 13 位 0 第 13 位 g 第 13 位 o 第 14 位 1 第 14 位 a 第 15 位 4 第 15 位 7 第 15 位 B 第 16 位 K 第 16 位 r 第 17 位 G 第 17 位 J 第 17 位 X 第 18 位 9 第 18 位 D 第 18 位 I 第 19 位 O 第 20 位 F 第 20 位 k
//2、根據SMC解碼,結合對反彙編程式碼的認知進行推理,在待選註冊碼範圍中人工篩選出最終答案:(作者你也太狠了吧,呵呵)
第1位元組:(唯一) 第 1 位 B --> “55” --> PUSH EBP 第2位元組: 第 2 位 j --> “96” --> XCHG EAX,ESI 不符合 第 2 位 w --> “8B” --> 8BEC MOV EBP,ESP 符合 推出第2位:“w”,選出前3位註冊碼為“Bwn” 第3位元組:(唯一) 第 3 位 n --> “EC” 第4位元組: 第 4 位 d --> “7D” --> JGE 不符合 第 4 位 s --> “6A” --> PUSH 符合 推出第4位:“s”,選出前4位註冊碼為“Bwns” 第5位元組: 第 5 位 A --> “FF” --> -1 符合 第 5 位 Y --> “E7” --> -19 不符合 第 5 位 l --> “D2” --> -2E 不符合 推出第5位:“A”,選出前5位註冊碼為“BwnsA” 第6位元組: 第 6 位 b --> “7E” --> JLE 不符合 第 6 位 t --> “68” --> PUSH 符合 推出第6位:“t”,選出前6位註冊碼為“BwnsAt” 第7位元組: 第 7 位 P --> “E8” --> 不確定 第 7 位 i --> “D1” --> 不確定 第8位元組: 第 8 位 H --> “28” --> 不確定 第 8 位 e --> “05” --> 不確定 第9位元組: 第 9 位 c --> “42” --> 不符合 第 9 位 d --> “45” --> 符合 第 9 位 s --> “52” --> 不符合 推出第9位:“d”,選出前9位註冊碼為“BwnsAt??d” 第10位元組: 第 10 位 P --> “39” --> 不符合 第 10 位 i --> “00” --> 符合 推出第10位:“i”,選出前10位註冊碼為“BwnsAt??di” 第11位元組:(唯一) 第 11 位 y --> “64” 選出前11位註冊碼為“BwnsAt??diy” 第12位元組: 第 12 位 2 --> “A1” --> 符合 第 12 位 5 --> “A6” --> 不符合 推出第12位:“2”,選出前12位註冊碼為“BwnsAt??diy2” 第13位元組: 第 13 位 0 --> “00” --> 不確定 第 13 位 g --> “57” --> 不確定 第 13 位 o --> “5F” --> 不確定 第14位元組: 第 14 位 1 --> “00” --> 不確定 第 14 位 a --> “50” --> 不確定 第15位元組: 第 15 位 4 --> “03” --> 不符合 第 15 位 7 --> “00” --> 符合 第 15 位 B --> “75” --> 不符合 推出第15位:“7”,選出前12位註冊碼為“BwnsAt??diy2??7” 第16位元組: 第 16 位 K --> “00” --> 符合 第 16 位 r --> “39” --> 不符合 結合第13、14、15的條件,應該是 MOV EAX,DWORD PTR FS:[0] 推出第13位:“0”,第14位:“1”,第16位:“K”,選出前16位註冊碼為“BwnsAt??diy2017K” 第17位元組: 第 17 位 G --> “4F” --> 關於EDI 不符合 第 17 位 J --> “42” --> 關於EDX 不符合 第 17 位 X --> “50” --> PUSH EAX 符合 推出第17位:“X”,選出前17位註冊碼為“BwnsAt??diy2017KX” 第18位元組: 第 18 位 9 --> “83” --> 符合 第 18 位 D --> “FE” --> 不符合 第 18 位 I --> “F3” --> 不符合 推出第18位:“9”,選出前18位註冊碼為“BwnsAt??diy2017KX9” 第19位元組:(唯一) 第 19 位 O --> “83” 選出前19位註冊碼為“BwnsAt??diy2017KX9O” 第20位元組: 第 20 位 F --> “09” --> 不符合 第 20 位 k --> “24” --> 符合 選出20註冊碼位“BwnsAt??diy2017KX9Ok”
//對不確定的第7、8位手工驗證,最多4次:
第1組、BwnsAtPHdiy2017KX9Ok 第2組、BwnsAtPediy2017KX9Ok 第3組、BwnsAtiHdiy2017KX9Ok 第4組、BwnsAtiediy2017KX9Ok
//當輸入第2組:BwnsAtPediy2017KX9Ok 彈出資訊成功提示“Well Done!:)”
//當輸入第4組:BwnsAtiediy2017KX9Ok 彈出空白資訊提示,確定後退出程式
//因此最終答案為:BwnsAtPediy2017KX9Ok
七、提示成功程式分析(SMC)
//SMC程式碼最終解密結果:
00EC0000 55 8B EC 6A FF 68 E8 05 45 00 64 A1 00 00 00 00 U嬱jh?E.d?... 00EC0010 50 83 EC 24 A1 84 04 40 00 33 C5 89 45 F0 50 8D P冹$@.3艍E餚 00EC0020 45 F4 64 A3 00 00 00 00 83 65 D8 00 8D 45 D8 50 E鬱?...僥?岴豍 00EC0030 8D 4D DC C7 45 DC 42 57 4E 53 51 8D 45 ED C7 45 峂芮E蹷WNSQ岴砬E 00EC0040 E0 15 32 22 3F 50 8D 45 E0 C7 45 E4 62 33 21 3D ?2"?P岴嗲E鋌3!= 00EC0050 50 8D 45 D0 C7 45 E8 27 76 74 7A 50 C6 45 EC 42 P岴星E?vtzP艵霣 00EC0060 E8 AE 10 55 FF 83 C4 14 8D 45 E0 6A 40 68 1D 3D 璁U兡岴鄇@h= 00EC0070 40 00 50 6A 00 FF 15 F0 3D 45 00 8B 4D F4 64 89 @.Pj.?E.婱鬱 00EC0080 0D 00 00 00 00 59 8B 4D F0 33 CD E8 CB 3E 55 FF .....Y婱?丸?U 00EC0090 8B E5 5D C3 64 嬪]胐..
//呼叫SMC執行,跟進
004118F1 . FF55 E8 CALL DWOR PTR SS:[EBP-0x18]
//SMC最終反彙編
00EC0000 55 PUSH EBP 00EC0001 8BEC MOV EBP,ESP 00EC0003 6A FF PUSH -0x1 00EC0005 68 E8054500 PUSH 0x4505E8 00EC000A 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 00EC0010 50 PUSH EAX 00EC0011 83EC 24 SUB ESP,0x24 00EC0014 A1 84044000 MOV EAX,DWORD PTR DS:[0x400484] 00EC0019 33C5 XOR EAX,EBP 00EC001B 8945 F0 MOV DWORD PTR SS:[EBP-0x10],EAX 00EC001E 50 PUSH EAX 00EC001F 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-0xC] 00EC0022 64:A3 00000000 MOV DWORD PTR FS:[0],EAX 00EC0028 8365 D8 00 AND DWORD PTR SS:[EBP-0x28],0x0 00EC002C 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-0x28] 00EC002F 50 PUSH EAX 00EC0030 8D4D DC LEA ECX,DWORD PTR SS:[EBP-0x24] 00EC0033 C745 DC 42574E53 MOV DWORD PTR SS:[EBP-0x24],0x534E5742 00EC003A 51 PUSH ECX 00EC003B 8D45 ED LEA EAX,DWORD PTR SS:[EBP-0x13] 00EC003E C745 E0 1532223F MOV DWORD PTR SS:[EBP-0x20],0x3F223215 00EC0045 50 PUSH EAX 00EC0046 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-0x20] 00EC0049 C745 E4 6233213D MOV DWORD PTR SS:[EBP-0x1C],0x3D213362 00EC0050 50 PUSH EAX 00EC0051 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-0x30] 00EC0054 C745 E8 2776747A MOV DWORD PTR SS:[EBP-0x18],0x7A747627 00EC005B 50 PUSH EAX 00EC005C C645 EC 42 MOV BYTE PTR SS:[EBP-0x14],0x42 00EC0060 E8 AE1055FF CALL 7-不問少.00411113 ; 解密提示資訊 00EC0065 83C4 14 ADD ESP,0x14 00EC0068 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-0x20] 00EC006B 6A 40 PUSH 0x40 00EC006D 68 1D3D4000 PUSH 0x403D1D 00EC0072 50 PUSH EAX ; 傳字串"Well done!:)" 00EC0073 6A 00 PUSH 0x0 00EC0075 FF15 F03D4500 CALL DWORD PTR DS:[>; user32.MessageBoxA 00EC007B 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-0xC] 00EC007E 64:890D 00000000 MOV DWORD PTR FS:[0],ECX 00EC0085 59 POP ECX 00EC0086 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-0x10] 00EC0089 33CD XOR ECX,EBP 00EC008B E8 CB3E55FF CALL 7-不問少.00413F5B 00EC0090 8BE5 MOV ESP,EBP 00EC0092 5D POP EBP 00EC0093 C3 RETN
//使用MessageBoxA顯示成功資訊
0012FA6C 00000000 |hOwner = NULL 0012FA70 0012FA90 |Text = "Well done!:)" 0012FA74 00403D1D |Title = "" 0012FA78 00000040 \Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
八、總結
這個作品的設計理念上乘,尤其結合SMC有效防止爆破,有實際應用價值。假如演算法和反除錯、反分析再做加強,得分還能提高!
最後感謝 WiFi 萬能鑰匙安全應急響應中心的贊助支援,
接下來的比賽大家一定要使出洪荒之力哦!↖(^ω^)↗
比心 ❤
上海連尚網路科技有限公司成立於 2013 年,是一家專注於提供免費上網和內容服務的移動網際網路企業。連尚網路自主研發的核心產品 WiFi 萬能鑰匙,以分享經濟的模式,透過雲端計算和大資料技術,利用熱點主人分享的閒置WiFi資源,為使用者提供免費、穩定、安全的上網服務,以幫助更多的人上網,找到屬於他們的機會,改變自己的命運。
相關文章
- 看雪.WiFi萬能鑰匙 CTF 2017第十題 點評及解題思路2017-06-28WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第五題 點評及解題思路2017-06-28WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第四題 點評及解題思路2017-06-29WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第三題 點評及解題思路2017-06-29WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第八題 點評及解題思路2017-06-22WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第十三題 點評及解題思路2017-06-28WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第十一題 點評及解題思路2017-06-28WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第十四題 點評及解題思路2017-06-30WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第十五題 點評及解題思路2017-08-10WiFi
- 看雪.WiFi萬能鑰匙 CTF 2017第十二 點評及解題思路2017-06-28WiFi
- 看雪.萬能鑰匙 CTF 2017第一題 WannaLOL 解題思路2017-06-29
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第七題點評及解析思路2017-11-07
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第二題點評及解析思路2017-10-28
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第三題點評及解析思路2017-10-30
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第八題點評及解析思路2017-11-09
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第五題點評及解析思路2017-11-03
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第四題點評及解析思路2017-11-02
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第六題點評及解析思路2017-11-06
- 看雪.騰訊TSRC 2017 CTF 秋季賽 第九題點評及解析思路2017-11-13
- 萬能wifi鑰匙2020-12-24WiFi
- 看雪.紐盾 KCTF 2019 Q3 | 第七題點評及解題思路2019-09-30
- 看雪.紐盾 KCTF 2019 Q2 | 第七題點評及解題思路2019-07-02
- 看雪CTF.TSRC 2018 團隊賽 第七題 『魔法森林』 解題思路2018-12-23
- WiFi萬能鑰匙安全應急響應中心贊助看雪 CTF 安全攻防大賽,5 萬大獎等你來拿!2017-05-24WiFi
- 看雪.紐盾 KCTF 2019 Q3 | 第一題點評及解題思路2019-09-25
- 看雪.紐盾 KCTF 2019 Q3 | 第四題點評及解題思路2019-09-29
- 看雪.紐盾 KCTF 2019 Q3 | 第六題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第八題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第九題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第十題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q2 | 第九題點評及解題思路2019-07-04
- 看雪.紐盾 KCTF 2019 Q2 | 第十題點評及解題思路2019-07-05
- 看雪.紐盾 KCTF 2019 Q2 | 第一題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第二題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第三題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第五題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第八題點評及解題思路2019-07-03
- 看雪.紐盾 KCTF 2019 Q2 | 第六題點評及解題思路2019-07-01