看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路
第十二題《移動迷宮》在今天(12月25日)中午12:00 結束攻擊!只有三支團隊成功破解防守方的題目。Ta們是:中午放題搬磚狗哭哭、萌新隊 和金左手,其中 中午放題搬磚狗哭哭 以 66668s 的成績奪得本題第一名!
本題結束後,防守團隊排行榜如下,出題團隊 OneName 一躍而上,成為防守團隊排行榜第三名!
最新賽況戰況一覽
第十二題之後,攻擊方最新排名情況如下:
中午放題搬磚狗哭哭繼續保持總排行的第一名, tekkens下降一名至第三名,金左手上升一名至第二名,其他排名不變。
金左手 有望成為亞軍候選人? tekkens 會在接下來的比賽中重新迴歸前二嗎?第一名還有可能被撼動嗎?這些答案將在最後三題中一 一 浮現。
第十二題 點評
crownless:
解開“移動迷宮”此題需要了解NSIS指令碼及檔案格式,識別Base64、AES的變形演算法並寫出逆演算法,繞過簡單的反除錯,並解出一道簡單的迷宮題,考查範圍較為全面。
第十二題 出題團隊簡介
出題團隊:OneName
第十二題 設計思路
由看雪論壇lacoucou 原創
key 為:
MhAyOFQSR2JDUEb0OUopUQkh5Ax23nEnCLxoBT06JRd7EdLrwooWsXQG68wLcneAqDy3UU78AgdrYnabVL0M9vd852girNqF9a3F
解題需要具備的知識:
1、NSIS 指令碼及檔案格式
2、Base64 演算法 (變形演算法,需要識別並寫出逆演算法)
3、AES 演算法 (變形演算法,需要識別並寫出逆演算法)
4、其他 C++知識
註冊碼驗證流程:
說明:
Bamer::B函式為Base64的解密函式,變形演算法程式中無加密算 法Bamer::A函式為 AES 演算法的解密函式 ,變形演算法,程式中無加密演算法
Bamer::P 函式為驗證輸入是否由數字和字母構成的函式
Bamer::C 函式為進位制轉換函式,支援 2-36 進位制的互轉
Bamer::G 函式為遊戲
Bamer::F 函式為註冊碼 FNVHash 驗證,防止多解。
釋放檔案說明:
Bamer.dll 成功主要驗證模組
msvcr100.dll 為系統支援庫,主要是Bamer.dll 需要此模組
KillProcDLL.dll 反除錯模組
nsDialogs.dllSystem.dll 為 NSIS 程式自帶程式,未作修改。以上檔案全部釋放在臨時目錄下,程式退出會自動刪除。
反除錯說明:
程式中用定時器做了一個簡單的反除錯,1 秒鐘檢測一次目前執行的所有程式,如果程式名字中包含 od ida dbg 則結束此程式。
繞過也很簡單: 偵錯程式改成 Test 等類似名字。功能實現在 KillProcDLL.dll 中。
遊戲說明:
如上圖所示的一個連線遊戲
1、要求所有顏色相同的點連在一起。
2、所有連線不能交叉,即任意一個格子只能被一種顏色佔領。
對於此圖的編碼轉換: 顏色對照表
最終形態:
程式破解流程:
1、此程式主程式是 NSIS 打包器,並且其檔案格式做了一定修改。需要還原後才能用 7z(老版本)解壓處 NSIS 指令碼檔案。
2、有了指令碼檔案,自然可以看到上述流程。
3、識別並逆向處 base64,AES 演算法,並寫出其加密演算法。
4、根據指令碼中的簡單異或加密演算法 還原出字串 2018TSCRCTF, 記為 key_1
5、解線性方程組, 獲得另一個固定字串 WelcomeHave 記為
key_3
解:
解為 WelcomeHave 對應的ASCII 碼
PS:方程組位於 NSIS 指令碼本,手工加了部分花指令
6、解出遊戲操作序列:
11133333333330000003333300333311130331113330300002
22222111220000003333333333311111333333333111113112
122222222221133333333000333333331111
並轉為36進位制
32WSFUPIFV9TYJWWPH14NZZ85YDHXOLO37ATG4IYC4ZCDI
KCA7EJ9 記 為key_4
7、key_3與key_4拼接進行AES加密,key為WelcomeToHavFun,
記為 key2
8、Key_1 與 key_2 拼接然後進行 base64 加密,可得到最終的 key
MhAyOFQSR2JDUEb0OUopUQkh5Ax23nEnCLxoBT06JRd7EdL
rwooWsXQG68wLcneAqDy3UU78AgdrYnabVL0M9vd852girN qF9a3F
成功截圖:
原文連結:
https://bbs.pediy.com/thread-247728.htm
第十二題 移動迷宮 解題思路
本題解析由看雪論壇 新手慢慢來原創。
觀察
大佬kkHAIKE有事,小弟代寫WP。
用 IDA 分析程式,發現程式呼叫了很多檔案處理相關的函式。
用IDA動態除錯程式,在IDA的輸出視窗發現程式一直在load KillProcDLL.dll和unlaod KillProcDLL.dll。
在KillProcDLL.dll所在目錄,發現程式在臨時目錄一共釋放出了5個dll檔案
用PEiD分析5個dll檔案發現Bamer.dll中用到了AES演算法,懷疑核心程式碼在Bamer.dll中,用IDA開啟Bamer.dll檔案,發現其匯出了ABCFGP6個函式,想看程式何時載入了Bamer.dll檔案,於是在.text:0040203E call ds:LoadLibraryExA處下了一個斷點,發現有一個執行緒一直在載入KillProcDLL.dll檔案,只好把斷點改為條件斷點:
"C:\Users\pc\AppData\Local\Temp\nsh7002.tmp\KillProcDLL" not in GetManyBytes(GetRegValue("ESI"),100)
於是一直動態除錯跟蹤,發現有一個巨大的switch case結構,像是一直在解釋程式碼執行。
在IDA中發現有Installer integrity check has failed字串,百度搜尋發現是NSIS中的提示資訊,程式肯定與NSIS有關,那個直譯器應該是在解釋NSIS指令碼,在網上發現7-ZipV15.05能提取NSIS指令碼,對比NSIS原始碼,找到讀取NSIS指令碼的地方。
發現原始碼中的頭部標識為Null,被修改為了XXXX。
修復檔案頭後,提取出NSIS指令碼如下:
; NSIS script NSIS-3 BadCmd=11 ; Install SetCompressor zlib ; -------------------- ; HEADER SIZE: 27310 ; START HEADER SIZE: 300 ; MAX STRING LENGTH: 1024 ; STRING CHARS: 2264 OutFile [NSIS].exe !include WinMessages.nsh ; -------------------- ; LANG TABLES: 1 ; LANG STRINGS: 40 Name "Pediy CTF TSRC 2018" BrandingText "Pediy CTF TSRC 2018" ; LANG: 1033 LangString LSTR_0 1033 "Pediy CTF TSRC 2018" LangString LSTR_1 1033 "$(LSTR_2) Setup" LangString LSTR_2 1033 "Pediy CTF TSRC 2018" LangString LSTR_5 1033 "Can't write: " LangString LSTR_8 1033 "Could not find symbol: " LangString LSTR_9 1033 "Could not load: " LangString LSTR_17 1033 "Error decompressing data! Corrupted installer?" LangString LSTR_21 1033 "Extract: " LangString LSTR_22 1033 "Extract: error writing to file " LangString LSTR_23 1033 "Installer corrupted: invalid opcode" LangString LSTR_24 1033 "No OLE for: " LangString LSTR_25 1033 "Output folder: " LangString LSTR_29 1033 "Skipped: " LangString LSTR_30 1033 "Copy Details To Clipboard" LangString LSTR_36 1033 "Error opening file for writing: $\r$\n$\r$\n$0$\r$\n$\r$\nClick Abort to stop the installation,$\r$\nRetry to try again, or$\r$\nIgnore to skip this file." LangString LSTR_37 1033 Custom LangString LSTR_38 1033 Cancel LangString LSTR_39 1033 &Close ; -------------------- ; VARIABLES: 7 Var _0_ Var _1_ Var _2_ Var _3_ Var _4_ Var _5_ Var _6_ InstType $(LSTR_37) ; Custom ; wininit = $WINDIR\wininit.ini ; -------------------- ; PAGES: 1 ; Page 0 Page custom func_747 "" /ENABLECANCEL ; -------------------- ; SECTIONS: 1 ; COMMANDS: 838 Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Invalid Function func_46 Exch $0 ; Push $0 ; Exch ; Pop $0 Push $1 Push $2 StrCpy $2 1 label_52: IntFmt $1 %c $2 StrCmpS $1 $0 0 label_56 StrCpy $0 $2 Goto label_59 label_56: IntOp $2 $2 + 1 StrCmp $2 255 0 label_52 StrCpy $0 0 label_59: Pop $2 Pop $1 Exch $0 ; Push $0 ; Exch ; Pop $0 Return KillProcDLL::KillProc ida ; Call Initialize_____Plugins ; SetOverwrite off ; File $PLUGINSDIR\KillProcDLL.dll ; SetDetailsPrint lastused ; Push ida ; CallInstDLL $PLUGINSDIR\KillProcDLL.dll KillProc KillProcDLL::KillProc Olly ; Call Initialize_____Plugins ; AllowSkipFiles off ; File $PLUGINSDIR\KillProcDLL.dll ; SetDetailsPrint lastused ; Push Olly ; CallInstDLL $PLUGINSDIR\KillProcDLL.dll KillProc KillProcDLL::KillProc OD ; Call Initialize_____Plugins ; File $PLUGINSDIR\KillProcDLL.dll ; SetDetailsPrint lastused ; Push OD ; CallInstDLL $PLUGINSDIR\KillProcDLL.dll KillProc KillProcDLL::KillProc dbg ; Call Initialize_____Plugins ; File $PLUGINSDIR\KillProcDLL.dll ; SetDetailsPrint lastused ; Push dbg ; CallInstDLL $PLUGINSDIR\KillProcDLL.dll KillProc FunctionEnd Function func_86 Exch $R8 ; Push $R8 ; Exch ; Pop $R8 StrLen $8 JTZmLD/8Sh6MOmd= Bamer::B JTZmLD/8Sh6MOmd= $8 ; Call Initialize_____Plugins ; AllowSkipFiles on ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $8 ; Push JTZmLD/8Sh6MOmd= ; CallInstDLL $PLUGINSDIR\Bamer.dll B Pop $R9 StrLen $R7 $R8 IntCmp $R7 11 label_99 label_120 label_120 label_99: IntOp $R6 0 + 0 label_100: StrCpy $R1 $R8 1 $R6 Push $R1 Call func_46 Pop $R1 IntOp $R2 $R1 ^ 0x17 IntOp $R3 $R2 - $R6 StrCpy $R4 $R9 1 $R6 Push $R4 Call func_46 Pop $R4 IntCmp $R3 $R4 0 label_120 label_120 StrCmp $R6 10 0 label_113 Goto label_115 label_113: IntOp $R6 $R6 + 1 Goto label_100 label_115: StrCpy $0 True Exch $0 ; Push $0 ; Exch ; Pop $0 Return label_120: StrCpy $0 False Exch $0 ; Push $0 ; Exch ; Pop $0 FunctionEnd Function func_125 Exch $0 ; Push $0 ; Exch ; Pop $0 StrCpy $1 $000010 Exch $1 ; Push $1 ; Exch ; Pop $1 FunctionEnd Function func_133 Exch $0 ; Push $0 ; Exch ; Pop $0 StrLen $1 $0 IntCmp $1 11 0 label_609 label_609 StrCpy $1 $0 1 0 StrCpy $2 $0 1 1 StrCpy $3 $0 1 2 StrCpy $4 $0 1 3 StrCpy $5 $0 1 4 StrCpy $6 $0 1 5 StrCpy $7 $0 1 6 StrCpy $8 $0 1 7 StrCpy $9 $0 1 8 StrCpy $_4_ $0 1 9 StrCpy $_5_ $0 1 10 Push $1 Call func_46 Pop $1 Push $2 Call func_46 Pop $2 Push $3 Call func_46 Pop $3 Push $4 Call func_46 Pop $4 Push $5 Call func_46 Pop $5 Push $6 Call func_46 Pop $6 Push $7 Call func_46 Pop $7 Push $8 Call func_46 Pop $8 Push $9 Call func_46 Pop $9 Push $_4_ Call func_46 Pop $_4_ Push $_5_ Call func_46 Pop $_5_ IntOp $R2 $1 * 18334 IntOp $R3 $2 * 19371 IntOp $R2 $R2 + $R3 IntOp $R4 $3 * 15568 IntOp $R3 $4 * 19321 IntOp $R4 $3 * 17784 IntOp $R2 $R2 - $R4 IntOp $R5 $R2 * 21534 IntOp $R5 $4 * 21534 IntOp $R3 $4 * 18321 IntOp $R2 $R2 + $R5 IntOp $R4 $R4 * 11321 IntOp $R3 $9 * 16158 IntOp $R6 $5 * 23633 IntOp $R5 $_5_ * 18278 IntOp $R7 $6 * 16027 IntOp $R8 $7 * 18430 IntOp $R2 $R2 + $R3 IntOp $R4 $_4_ * 15917 IntOp $R9 $8 * 24544 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R7 IntOp $R3 $R3 * 25621 IntOp $R2 $R2 + $R5 IntOp $R2 $R2 - $R8 IntOp $R5 $R2 * 33321 IntOp $R2 $R2 + $R4 IntOp $R4 $R3 * 25321 IntOp $R2 $R2 - $R9 IntOp $R3 $R2 * 12345 IntOp $R2 $1 * 19292 IntOp $R4 $3 * 17677 IntOp $R5 $4 * 18327 IntOp $R9 $8 * 20472 IntOp $R6 $5 * 19344 IntOp $R3 $2 * 21770 IntOp $R7 $6 * 16593 IntOp $R8 $7 * 20094 IntOp $R2 $R2 - $R8 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R2 $R2 - $R5 IntOp $R2 $R2 + $R6 IntOp $R2 $R2 + $R7 IntOp $R3 $9 * 19029 IntOp $R4 $_4_ * 16001 IntOp $R5 $_5_ * 20980 IntOp $R2 $R2 - $R3 IntOp $R2 $R2 + $R4 IntOp $R2 $R2 - $R5 IntCmp $R2 5295553 0 label_609 label_609 IntOp $R3 $R2 * 17228 IntOp $R4 $R2 * 17228 IntOp $R2 $R2 + $R5 IntOp $R5 $R3 * 17228 IntOp $R7 $6 * 19397 IntOp $R3 $R2 * 17228 IntOp $R8 $7 * 21857 IntOp $R3 $R2 * 17228 IntOp $R9 $8 * 23641 IntOp $R2 $R2 + $R8 IntOp $R3 $R2 * 17228 IntOp $R8 $7 * 24396 IntOp $R2 $1 * 23630 IntOp $R3 $2 * 23633 IntOp $R6 $5 * 17525 IntOp $R4 $3 * 18077 IntOp $R5 $4 * 15076 IntOp $R2 $R2 - $R3 IntOp $R2 $R2 - $R4 IntOp $R2 $R2 + $R5 IntOp $R7 $6 * 15510 IntOp $R2 $R2 + $R8 IntOp $R9 $8 * 24273 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 - $R7 IntOp $R3 $9 * 24865 IntOp $R4 $_4_ * 22272 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R5 $_5_ * 18068 IntOp $R2 $R2 + $R5 IntOp $R2 0 + 0 IntOp $R9 $8 * 24749 IntOp $R3 $2 * 17754 IntOp $R5 $4 * 24365 IntOp $R6 $5 * 20645 IntOp $R2 $1 * 17901 IntOp $R7 $6 * 20553 IntOp $R4 $3 * 22962 IntOp $R8 $7 * 21906 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 - $R7 IntOp $R2 $R2 + $R8 IntOp $R2 $R2 + $R4 IntOp $R2 $R2 - $R5 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 - $R6 IntOp $R3 $9 * 20195 IntOp $R2 $R2 + $R3 IntOp $R4 $_4_ * 20968 IntOp $R2 $R2 + $R4 IntOp $R5 $_5_ * 17780 IntOp $R2 $R2 - $R5 IntCmp $R2 5518223 0 label_609 label_609 IntOp $R3 $R2 * 17228 IntOp $R4 $R2 * 17228 IntOp $R2 $R2 + $R5 IntOp $R5 $R3 * 17228 IntOp $R7 $6 * 19397 IntOp $R3 $R2 * 17228 IntOp $R8 $7 * 21857 IntOp $R3 $R2 * 17228 IntOp $R9 $8 * 23641 IntOp $R2 $R2 + $R8 IntOp $R3 $R2 * 17228 IntOp $R8 $7 * 24396 IntOp $R2 $1 * 23630 IntOp $R3 $2 * 23633 IntOp $R6 $5 * 17525 IntOp $R4 $3 * 18077 IntOp $R5 $4 * 15076 IntOp $R2 $R2 - $R3 IntOp $R2 $R2 - $R4 IntOp $R2 $R2 + $R5 IntOp $R7 $6 * 15510 IntOp $R2 $R2 + $R8 IntOp $R9 $8 * 24273 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 - $R7 IntOp $R3 $9 * 24865 IntOp $R4 $_4_ * 22272 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R5 $_5_ * 18068 IntOp $R2 $R2 + $R5 IntCmp $R2 6649741 0 label_609 label_609 IntOp $R4 $3 * 18077 IntOp $R5 $4 * 15076 IntOp $R2 $R2 - $R3 IntOp $R2 $R2 - $R4 IntOp $R2 $R2 + $R5 IntOp $R7 $6 * 15510 IntOp $R2 $R2 + $R8 IntOp $R9 $8 * 24273 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 - $R7 IntOp $R5 $4 * 21286 IntOp $R2 $1 * 17723 IntOp $R4 $3 * 22913 IntOp $R3 $2 * 22504 IntOp $R6 $5 * 16384 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R6 IntOp $R2 $R2 - $R4 IntOp $R2 $R2 + $R5 IntOp $R7 $6 * 15349 IntOp $R3 $9 * 17180 IntOp $R4 $_4_ * 20872 IntOp $R8 $7 * 22234 IntOp $R9 $8 * 23057 IntOp $R2 $R2 + $R7 IntOp $R2 $R2 - $R8 IntOp $R2 $R2 - $R9 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 - $R4 IntOp $R5 $_5_ * 22229 IntOp $R2 $R2 + $R5 IntCmp $R2 4482135 0 label_609 label_609 IntOp $R2 $1 * 18536 IntOp $R9 $8 * 15487 IntOp $R7 $6 * 23787 IntOp $R8 $7 * 23788 IntOp $R2 $R2 - $R9 IntOp $R2 $R2 + $R8 IntOp $R2 $R2 - $R7 IntOp $R6 $5 * 15180 IntOp $R3 $2 * 18849 IntOp $R2 $R2 + $R6 IntOp $R4 $3 * 19901 IntOp $R2 $R2 + $R3 IntOp $R3 $9 * 16571 IntOp $R5 $4 * 18443 IntOp $R2 $R2 - $R5 IntOp $R5 $_5_ * 17695 IntOp $R2 $R2 - $R4 IntOp $R4 $_4_ * 15420 IntOp $R2 $R2 + $R5 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R2 $1 * 18536 IntOp $R9 $8 * 15487 IntOp $R7 $6 * 23787 IntOp $R8 $7 * 23788 IntOp $R2 $R2 - $R9 IntOp $R2 $R2 + $R8 IntOp $R2 $R2 - $R7 IntOp $R6 $5 * 15180 IntOp $R3 $2 * 18849 IntOp $R2 $R2 + $R6 IntOp $R4 $3 * 19901 IntOp $R2 $R2 + $R3 IntOp $R3 $9 * 16571 IntOp $R5 $4 * 18443 IntOp $R2 $R2 - $R5 IntOp $R5 $_5_ * 17695 IntOp $R2 $R2 - $R4 IntOp $R4 $_4_ * 15420 IntOp $R2 $R2 + $R5 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntCmp $R2 5135079 0 label_609 label_609 IntOp $R3 $R2 * 17228 IntOp $R9 $8 * 23641 IntOp $R2 $R2 + $R8 IntOp $R3 $R2 * 17228 IntOp $R2 $R2 + $R9 IntOp $R3 $R2 * 17228 IntOp $R2 $R2 + $R6 IntOp $R3 $R2 * 17228 IntOp $R2 $1 * 20282 IntOp $R3 $2 * 21583 IntOp $R2 $R2 + $R3 IntOp $R4 $3 * 18830 IntOp $R2 $R2 + $R4 IntOp $R5 $4 * 24997 IntOp $R2 $R2 + $R5 IntOp $R6 $5 * 17723 IntOp $R2 $R2 + $R6 IntOp $R7 $6 * 24278 IntOp $R2 $R2 - $R7 IntOp $R8 $7 * 22517 IntOp $R2 $R2 - $R8 IntOp $R9 $8 * 20548 IntOp $R2 $R2 + $R9 IntOp $R3 $9 * 24963 IntOp $R2 $R2 + $R3 IntOp $R4 $_4_ * 19274 IntOp $R2 $R2 - $R4 IntOp $R5 $_5_ * 18086 IntOp $R2 $R2 - $R5 IntCmp $R2 5299343 0 label_609 label_609 IntOp $R2 $1 * 22035 IntOp $R3 $2 * 23475 IntOp $R2 $R2 + $R3 IntOp $R4 $3 * 16349 IntOp $R3 $R2 * 17228 IntOp $R5 $4 * 18849 IntOp $R2 $R2 - $R4 IntOp $R6 $5 * 22560 IntOp $R3 $R2 * 17228 IntOp $R4 $R2 * 17228 IntOp $R2 $R2 + $R5 IntOp $R5 $R3 * 17228 IntOp $R7 $6 * 19397 IntOp $R3 $R2 * 17228 IntOp $R8 $7 * 21857 IntOp $R3 $R2 * 17228 IntOp $R9 $8 * 23641 IntOp $R2 $R2 + $R8 IntOp $R3 $R2 * 17228 IntOp $R2 $R2 + $R9 IntOp $R3 $R2 * 17228 IntOp $R2 $R2 + $R6 IntOp $R3 $R2 * 17228 IntOp $R2 $R2 - $R7 IntOp $R3 $9 * 15110 IntOp $R2 $R2 - $R3 IntOp $R4 $_4_ * 21024 IntOp $R2 $R2 + $R4 IntOp $R5 $_5_ * 21705 IntOp $R2 $R2 + $R5 IntCmp $R2 11895342 0 label_609 label_609 IntOp $R2 $1 * 17297 IntOp $R5 $R3 ^ 18614 IntOp $R3 $R5 * 20004 IntOp $R3 $4 * 20004 IntOp $R4 $R3 * 10014 IntOp $R4 $3 * 20329 IntOp $R5 $R1 * 18614 IntOp $R5 $4 * 24185 IntOp $R6 $5 * 24637 IntOp $R2 $R5 + $R3 IntOp $R2 $R2 + $R4 IntOp $R7 $6 * 15223 IntOp $R8 $R2 * 15223 IntOp $R8 $7 * 19192 IntOp $R2 $R2 - $R5 IntOp $R9 $1 * 23539 IntOp $R2 $R2 - $R6 IntOp $R3 $R2 * 22104 IntOp $R2 $R2 - $R7 IntOp $R3 $R2 * 33304 IntOp $R2 $R2 - $R8 IntOp $R2 $R2 - $R9 IntOp $R3 $R2 * 20004 IntOp $R3 $9 * 23170 IntOp $R4 $_4_ * 17101 IntOp $R5 $_5_ * 16781 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R2 $R2 + $R5 IntOp $R2 $1 * 18334 IntOp $R3 $2 * 19371 IntOp $R2 $R2 + $R3 IntOp $R4 $3 * 15568 IntOp $R3 $4 * 19321 IntOp $R4 $3 * 17784 IntOp $R2 $R2 - $R4 IntOp $R5 $R2 * 21534 IntOp $R5 $4 * 21534 IntOp $R3 $4 * 18321 IntOp $R2 $R2 + $R5 IntOp $R4 $R4 * 11321 IntOp $R3 $9 * 16158 IntOp $R6 $5 * 23633 IntOp $R5 $_5_ * 18278 IntOp $R7 $6 * 16027 IntOp $R8 $7 * 18430 IntOp $R2 $R2 + $R3 IntOp $R4 $_4_ * 15917 IntOp $R9 $8 * 24544 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R7 IntOp $R3 $R3 * 25621 IntOp $R2 $R2 + $R5 IntOp $R2 $R2 - $R8 IntOp $R5 $R2 * 33321 IntOp $R2 $R2 + $R4 IntOp $R4 $R3 * 25321 IntOp $R2 $R2 - $R9 IntOp $R3 $R2 * 12345 IntCmp $R2 4549415 0 label_609 label_609 IntOp $R2 $1 * 20198 IntOp $R3 $2 * 22945 IntOp $R8 $R3 * 23321 IntOp $R4 $3 * 23807 IntOp $R7 $R3 * 17621 IntOp $R5 $4 * 17050 IntOp $R6 $5 * 21682 IntOp $R2 $R2 + $R3 IntOp $R7 $6 * 16136 IntOp $R8 $R3 * 35621 IntOp $R2 $R2 - $R5 IntOp $R8 $7 * 23014 IntOp $R9 $8 * 19532 IntOp $R2 $R2 + $R4 IntOp $R3 $9 * 19020 IntOp $R4 $_4_ * 23750 IntOp $R5 $R3 * 25621 IntOp $R5 $_5_ * 19323 IntOp $R2 $R2 - $R6 IntOp $R2 $R2 + $R7 IntOp $R2 $R2 - $R3 IntOp $R2 $R2 - $R4 IntOp $R2 $R2 + $R5 IntOp $R2 $R2 + $R8 IntOp $R2 $R2 + $R9 IntCmp $R2 5344900 0 label_609 label_609 IntOp $R3 $2 * 10086 IntOp $R2 $1 * 18800 IntOp $R3 $2 * 15632 IntOp $R5 $3 * 22359 IntOp $R2 $R2 - $R3 IntOp $R4 $3 * 23898 IntOp $R5 $R4 * 22359 IntOp $R2 $R2 + $R4 IntOp $R5 $4 * 22359 IntOp $R3 $9 * 21734 IntOp $R2 $R2 + $R3 IntOp $R3 $5 * 22386 IntOp $R2 $R2 + $R5 IntOp $R6 $5 * 20855 IntOp $R2 $R2 + $R6 IntOp $R7 $6 * 16366 IntOp $R2 $R2 + $R7 IntOp $R3 $5 * 14486 IntOp $R8 $7 * 15562 IntOp $R4 $_4_ * 21130 IntOp $R3 $5 * 22336 IntOp $R5 $_5_ * 20089 IntOp $R9 $8 * 21845 IntOp $R2 $R2 - $R8 IntOp $R2 $R2 + $R9 IntOp $R2 $R2 + $R4 IntOp $R3 $5 * 2556 IntOp $R2 $R2 + $R5 IntCmp $R2 15581697 0 label_609 label_609 IntOp $R2 $1 * 17297 IntOp $R5 $R3 ^ 18614 IntOp $R3 $R2 * 20004 IntOp $R3 $2 * 20004 IntOp $R4 $R3 * 10014 IntOp $R4 $3 * 20329 IntOp $R5 $R3 * 18614 IntOp $R5 $4 * 24185 IntOp $R6 $5 * 24637 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R7 $6 * 15223 IntOp $R8 $R7 * 15223 IntOp $R8 $7 * 19192 IntOp $R2 $R2 - $R5 IntOp $R9 $8 * 23539 IntOp $R2 $R2 - $R6 IntOp $R3 $R2 * 22104 IntOp $R2 $R2 - $R7 IntOp $R3 $R2 * 33304 IntOp $R2 $R2 - $R8 IntOp $R2 $R2 - $R9 IntOp $R3 $R2 * 20004 IntOp $R3 $9 * 23170 IntOp $R4 $_4_ * 17101 IntOp $R5 $_5_ * 16781 IntOp $R2 $R2 + $R3 IntOp $R2 $R2 + $R4 IntOp $R2 $R2 + $R5 IntCmp $R2 1259535 0 label_609 label_609 StrCpy $0 True Exch $0 ; Push $0 ; Exch ; Pop $0 Return label_609: StrCpy $0 False Exch $0 ; Push $0 ; Exch ; Pop $0 Return FunctionEnd Function func_615 Exch $0 ; Push $0 ; Exch ; Pop $0 Push $R0 Push $R0 Push $R2 IntOp $R0 0 + 0 IntOp $R1 $R0 + 10 IntOp $R2 $R1 + 0x4A StrCpy $1 $0 7 0 IntFmt $R0 %c $R2 StrCpy $2 $1$R0 IntFmt $R2 %c 0x6f StrCpy $2 $2$R2 StrCpy $1 $2 1 1 StrCpy $3 $0 4 7 StrCpy $4 $2$3 IntFmt $R0 %c 0x46 IntFmt $R1 %c 0x75 IntFmt $R2 %c 0x6e StrCpy $5 $4$R0$R1$R2 Pop $R2 Pop $R1 Pop $R0 Exch $5 ; Push $5 ; Exch ; Pop $5 Return System::Call user32::GetWindowText(p$_1_,t.s,i1024) ; Call Initialize_____Plugins ; File $PLUGINSDIR\System.dll ; SetDetailsPrint lastused ; Push user32::GetWindowText(p$_1_,t.s,i1024) ; CallInstDLL $PLUGINSDIR\System.dll Call Pop $0 StrCpy $_3_ $0 Bamer::P $0 ; Call Initialize_____Plugins ; AllowSkipFiles off ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $0 ; CallInstDLL $PLUGINSDIR\Bamer.dll P Pop $R0 StrCmp $R0 0 0 label_658 Goto label_737 label_658: StrLen $1 $0 IntCmp $1 100 0 label_737 label_737 Bamer::B $0 $1 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $1 ; Push $0 ; CallInstDLL $PLUGINSDIR\Bamer.dll B Pop $2 StrCpy $3 $2 11 0 Push $3 Call func_86 Pop $R0 StrCmp $R0 False 0 label_673 Goto label_737 label_673: Push $3 Call func_125 Pop $3 StrCpy $4 $2 64 11 StrLen $R0 $4 StrCmp $R0 64 label_680 Goto label_737 label_680: Bamer::A $4 64 $3 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $3 ; Push 64 ; Push $4 ; CallInstDLL $PLUGINSDIR\Bamer.dll A Pop $R0 StrCmp $R0 0 0 label_690 Goto label_737 label_690: Pop $R1 StrCpy $5 $R1 11 0 StrCpy $_6_ $5 Push $5 Call func_133 Pop $R0 StrCmp $R0 False 0 label_698 Goto label_737 label_698: StrCpy $6 $R1 53 11 Bamer::C 36 4 $6 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $6 ; Push 4 ; Push 36 ; CallInstDLL $PLUGINSDIR\Bamer.dll C Pop $R2 Push $_6_ Call func_615 Pop $5 Bamer::G $5 $R2 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $R2 ; Push $5 ; CallInstDLL $PLUGINSDIR\Bamer.dll G Pop $R0 StrCmp $R0 0 0 label_719 Goto label_737 label_719: Bamer::F $_3_ ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $_3_ ; CallInstDLL $PLUGINSDIR\Bamer.dll F Pop $R0 StrCmp $R0 0 0 label_727 Goto label_737 label_727: StrLen $R1 XX+2IHcragE= Bamer::B XX+2IHcragE= $R1 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $R1 ; Push XX+2IHcragE= ; CallInstDLL $PLUGINSDIR\Bamer.dll B Pop $R2 MessageBox MB_OK $R2 Return label_737: StrLen $R1 U0JtakdiZX6wc1UxIR== Bamer::B U0JtakdiZX6wc1UxIR== $R1 ; Call Initialize_____Plugins ; File $PLUGINSDIR\Bamer.dll ; SetDetailsPrint lastused ; Push $R1 ; Push U0JtakdiZX6wc1UxIR== ; CallInstDLL $PLUGINSDIR\Bamer.dll B Pop $R2 MessageBox MB_OK|MB_ICONINFORMATION $R2 FunctionEnd Function func_747 ; Page 0, Pre nsDialogs::Create 1018 ; Call Initialize_____Plugins ; AllowSkipFiles on ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push 1018 ; CallInstDLL $PLUGINSDIR\nsDialogs.dll Create Pop $_0_ nsDialogs::CreateControl STATIC 0x40000000|0x10000000|0x04000000|0x00000100 0x00000020 0u 0u 100% 12u Serial: ; Call Initialize_____Plugins ; AllowSkipFiles off ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push Serial: ; Push 12u ; Push 100% ; Push 0u ; Push 0u ; Push 0x00000020 ; Push 0x40000000|0x10000000|0x04000000|0x00000100 ; Push STATIC ; CallInstDLL $PLUGINSDIR\nsDialogs.dll CreateControl nsDialogs::CreateControl EDIT 0x40000000|0x10000000|0x04000000|0x00010000|0x00000080 0x00000100|0x00000200 0u 20u 100% 12u "" ; Call Initialize_____Plugins ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push "" ; Push 12u ; Push 100% ; Push 20u ; Push 0u ; Push 0x00000100|0x00000200 ; Push 0x40000000|0x10000000|0x04000000|0x00010000|0x00000080 ; Push EDIT ; CallInstDLL $PLUGINSDIR\nsDialogs.dll CreateControl Pop $_1_ SendMessage $_1_ 0x00C5 110 0 nsDialogs::CreateControl BUTTON 0x40000000|0x10000000|0x04000000|0x00010000 0 25% 52u 50% 14u Check ; Call Initialize_____Plugins ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push Check ; Push 14u ; Push 50% ; Push 52u ; Push 25% ; Push 0 ; Push 0x40000000|0x10000000|0x04000000|0x00010000 ; Push BUTTON ; CallInstDLL $PLUGINSDIR\nsDialogs.dll CreateControl Pop $_2_ Push $0 Push $1 StrCpy $1 $_2_ StrCpy $0 644 nsDialogs::OnClick $1 $0 ; Call Initialize_____Plugins ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push $0 ; Push $1 ; CallInstDLL $PLUGINSDIR\nsDialogs.dll OnClick Pop $1 Pop $0 Push $0 StrCpy $0 66 nsDialogs::CreateTimer $0 1000 ; Call Initialize_____Plugins ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; Push 1000 ; Push $0 ; CallInstDLL $PLUGINSDIR\nsDialogs.dll CreateTimer Pop $0 nsDialogs::Show ; Call Initialize_____Plugins ; File $PLUGINSDIR\nsDialogs.dll ; SetDetailsPrint lastused ; CallInstDLL $PLUGINSDIR\nsDialogs.dll Show FunctionEnd Function .onInit InitPluginsDir ; Call Initialize_____Plugins ; SetDetailsPrint lastused SetOutPath $PLUGINSDIR SetOverwrite on AllowSkipFiles on File msvcr100.dll FunctionEnd Section ; Section_0 SectionEnd /* Function Initialize_____Plugins SetDetailsPrint none StrCmp $PLUGINSDIR "" 0 label_834 Push $0 SetErrors GetTempFileName $0 Delete $0 CreateDirectory $0 ; !!!! Unknown Params:$0 "" ProgramFilesDir ; 100 0 1 IfErrors label_835 StrCpy $PLUGINSDIR $0 Pop $0 label_834: Return label_835: MessageBox MB_OK|MB_ICONSTOP "Error! Can't initialize plug-ins directory. Please try again later." /SD IDOK Quit FunctionEnd */ ; -------------------- ; UNREFERENCED STRINGS: /* 17 CommonFilesDir 32 "C:\Program Files" 49 $PROGRAMFILES 53 "$PROGRAMFILES\Common Files" 70 $COMMONFILES 90 -1 95 -$R0 */ 程式流程分析 程式會一直呼叫KillProcDL.dll中的KillProc來kill IDA和OD,但不知為何並沒有關掉我的IDA,點選check按鈕後會呼叫System.dll中的Call函式呼叫user32::GetWindowText(p$1,t.s,i1024)獲取使用者輸入,然後呼叫Bamer.dll中的P函式檢查輸入的字串是否只為0-9,a-z,A-Z,然後判斷輸入的長度是否為100,然後將輸入的字串用Bamer.dll中的B函式做一個變換(修改過的base64,多了一個異或),然後取了前11個字元做了檢驗。 def dec11(): tmp = b64dec("JTZmLD/8Sh6MOmd=") ret = "" for i in xrange(len(tmp)): ret += chr((ord(tmp[i]) + i) ^ 0x17) return ret
得到輸入解碼後的前11個字元為2018TSCRCTF,和00010拼接後以2018TSCRCTF00010作為金鑰key,呼叫Bamer.dll中的A函式(修改過的AES,直接動態除錯提取出roundkey,AES解密演算法的初始輪金鑰加和最後一輪輪金鑰加的異或順序被改變了,中間異或時還交換了第三列和第四列的位置)解密後64位元組。
然後取解密後的前11個位元組傳入func_133中校驗,可編寫z3指令碼求出得到前11個位元組為WelcomeHave,然後把後53位元組的資料傳入Bamer.dll中的C函式做36進位制轉換到4進位制(大小寫字母等價),然後把得到的資料和把WelcomeHave經func_615變換得到WelcomeToHaveFun,傳入Bamer.dll中的G函式做檢驗,傳入的WelcomeToHaveFun作金鑰解密地圖,4進位制的資料相當於控制字母移動,G函式中有一個迷宮地圖。
...........B
.R...Y..A...
............
.....DG..R..
............
......B.S...
............
.......D....
.......P....
......Y.....
.......G..S.
.....P...A..
aa = 'ABDGPRSY'
#bb = '\x18\x0b56\x87\x11X\x15\x00\x00\x8dv'
bb = [(8, 1), (11, 0), (5, 3), (6, 3), (7, 8), (1, 1), (8, 5), (5, 1)]
#cc = '\xb9Vw\xa7\xb59\xaa\x96\x00\x009t'
cc = [(9, 11), (6, 5), (7, 7), (7, 10), (5, 11), (9, 3), (10, 10), (6, 9)]
aa 是各字元
bb 該字元起點座標
cc 該字元終點座標
C 函式輸出畫法 0 1 2 3 對應 左 右 上 下
每個字元,從起點座標畫同字元點,直到終點座標,中間只能經過 .
比如 A 按照 畫法 畫到終點後,繼續畫法 畫B
最後要填滿地圖,不能有 “.”。
大佬手動解出
得到4進位制資料為:
1113333333333000000333330033331113033111333030000222222111220000003333333333311111333333333111113112122222222221133333333000333333331111
從而得到36進位制資料為:
32WSFUPIFV9TYJWWPH14NZZ85YDHXOLO37ATG4IYC4ZCDIKCA7EJ9
加上前WelcomeHave,經AES加密(修改過的)得到:
"\xb7\x39\x5a\xab\x55\x19\xa3\xe8\x0c\xb5\xd2\x51\x25\x08\xbc\xaa\x05\x2d\xf9\x25\x07\x38\x11\xc2\xe9\xce\xaa\x97\xb9\x64\x46\xe7\xfc\xcb\x76\x57\xc0\xa0\x3c\x74\x55\x5e\x3f\x02\x27\x29\x66\x56\xda\x50\xbd\xcc\xfa\xd7\x3f\xeb\x58\xa0\xa4\xda\x05\xf9\xbd\x05"
最後加上2018TSCRCTF,做base64(修改過的)編碼得到註冊碼:
MhAyOFQSR2JDUEb0OUopUQkh5Ax23nEnCLxoBT06JRd7EdLrwooWsXQG68wLcneAqDy3UU78AgdrYnabVL0M9vd852girNqF9a3F
原文連結:
https://bbs.pediy.com/thread-248631.htm
看雪CTF.TSRC 2018 團隊賽 解題思路彙總:
相關文章
- 看雪CTF.TSRC 2018 團隊賽 第七題 『魔法森林』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第九題『諜戰』 解題思路2018-12-19
- 看雪CTF.TSRC 2018 團隊賽 第一題 『初世紀』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第二題 『半加器』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第五題 『交響曲』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第六題 『追凶者也』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第八題 『二向箔』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十題『俠義雙雄』 解題思路2018-12-21
- 看雪CTF.TSRC 2018 團隊賽 第三題 『七十二疑冢』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第四題 『盜夢空間』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十一題『伊甸園』 解題思路2018-12-23
- 看雪CTF.TSRC 2018 團隊賽 第十五題『 密碼風雲』 解題思路2019-01-02密碼
- 看雪CTF.TSRC 2018 團隊賽 第十四題『 你眼中的世界』 解題思路2018-12-29
- 看雪CTF.TSRC 2018 團隊賽 第十三題『 機器人歷險記』 解題思路2018-12-27機器人
- 看雪CTF.TSRC 2018 團隊賽 獲獎名單公示2019-01-02
- 看雪.紐盾 KCTF 2019 Q3 | 第十二題點評及解題思路2019-10-08
- 看雪.WiFi萬能鑰匙 CTF 2017第十二 點評及解題思路2017-06-28WiFi
- 回溯法解決迷宮問題2018-02-08
- 用C語言解決迷宮問題2014-06-10C語言
- 華為優招面試題---迷宮問題2017-07-15面試題
- 回溯法求迷宮問題2024-10-12
- POJ3984-迷宮問題2024-09-04
- [SDOI2012] 走迷宮 題解2024-07-23
- 看雪.萬能鑰匙 CTF 2017第一題 WannaLOL 解題思路2017-06-29
- 看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第八題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第九題設計思路及解析2021-05-28
- 看雪·深信服 2021 KCTF 春季賽 | 第四題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第五題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第六題設計思路及解析2021-05-21
- 看雪·深信服 2021 KCTF 春季賽 | 第二題設計思路及解析2021-05-12
- 看雪·深信服 2021 KCTF 春季賽 | 第三題設計思路及解析2021-05-14
- 看雪·深信服 2021 KCTF 春季賽 | 第十題設計思路及解析2021-05-31
- 看雪·眾安 2021 KCTF 秋季賽 | 第十題設計思路及解析2021-12-16
- 看雪·眾安 2021 KCTF 秋季賽 | 第九題設計思路及解析2021-12-09
- 看雪·眾安 2021 KCTF 秋季賽 | 第七題設計思路及解析2021-12-03
- 看雪·眾安 2021 KCTF 秋季賽 | 第五題設計思路及解析2021-11-29
- 看雪·眾安 2021 KCTF 秋季賽 | 第三題設計思路及解析2021-11-22