看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路

Editor發表於2018-12-25

看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


第十二題《移動迷宮》在今天(12月25日)中午12:00 結束攻擊!只有三支團隊成功破解防守方的題目。Ta們是:中午放題搬磚狗哭哭、萌新隊 和金左手,其中 中午放題搬磚狗哭哭 以 66668s 的成績奪得本題第一名!


本題結束後,防守團隊排行榜如下,出題團隊 OneName 一躍而上,成為防守團隊排行榜第三名!


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路



最新賽況戰況一覽


第十二題之後,攻擊方最新排名情況如下:


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


中午放題搬磚狗哭哭繼續保持總排行的第一名, tekkens下降一名至第三名,金左手上升一名至第二名,其他排名不變。


金左手 有望成為亞軍候選人? tekkens 會在接下來的比賽中重新迴歸前二嗎?第一名還有可能被撼動嗎?這些答案將在最後三題中一 一 浮現。



第十二題 點評


crownless:


解開“移動迷宮”此題需要了解NSIS指令碼及檔案格式,識別Base64、AES的變形演算法並寫出逆演算法,繞過簡單的反除錯,並解出一道簡單的迷宮題,考查範圍較為全面。



第十二題 出題團隊簡介


出題團隊:OneName 


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路



第十二題 設計思路


由看雪論壇lacoucou 原創


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


key 為:

MhAyOFQSR2JDUEb0OUopUQkh5Ax23nEnCLxoBT06JRd7EdLrwooWsXQG68wLcneAqDy3UU78AgdrYnabVL0M9vd852girNqF9a3F



解題需要具備的知識:


1、NSIS 指令碼及檔案格式

2、Base64 演算法 (變形演算法,需要識別並寫出逆演算法)

3、AES 演算法 (變形演算法,需要識別並寫出逆演算法)

4、其他 C++知識



註冊碼驗證流程:

看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


說明:


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 中。



遊戲說明:


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


如上圖所示的一個連線遊戲


1、要求所有顏色相同的點連在一起。


2、所有連線不能交叉,即任意一個格子只能被一種顏色佔領。


對於此圖的編碼轉換: 顏色對照表


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路

看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


最終形態:


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


程式破解流程:


1、此程式主程式是 NSIS 打包器,並且其檔案格式做了一定修改。需要還原後才能用 7z(老版本)解壓處 NSIS 指令碼檔案。


2、有了指令碼檔案,自然可以看到上述流程。


3、識別並逆向處 base64,AES 演算法,並寫出其加密演算法。


4、根據指令碼中的簡單異或加密演算法 還原出字串 2018TSCRCTF, 記為 key_1


5、解線性方程組, 獲得另一個固定字串  WelcomeHave 記為


key_3


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


解:


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


解為 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



成功截圖:


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


原文連結:

https://bbs.pediy.com/thread-247728.htm



第十二題  移動迷宮 解題思路


本題解析由看雪論壇 新手慢慢來原創。


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


觀察


大佬kkHAIKE有事,小弟代寫WP。


用 IDA 分析程式,發現程式呼叫了很多檔案處理相關的函式。


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


用IDA動態除錯程式,在IDA的輸出視窗發現程式一直在load KillProcDLL.dll和unlaod KillProcDLL.dll。


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


在KillProcDLL.dll所在目錄,發現程式在臨時目錄一共釋放出了5個dll檔案 


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


用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指令碼的地方。


看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路


發現原始碼中的頭部標識為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

最後要填滿地圖,不能有 “.”。


大佬手動解出

看雪CTF.TSRC 2018 團隊賽 第十二題『移動迷宮』 解題思路

得到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 團隊賽 解題思路彙總: 













相關文章