看雪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
第十三题【 机器人历险记】正在火热进行中
第13题/共15题
《机器人历险记》将于 12月27 日中午 12:00 结束
赶紧参与进来吧~!
热门图书推荐:
合作伙伴
腾讯安全应急响应中心
TSRC,腾讯安全的先头兵,肩负腾讯公司安全漏洞、黑客入侵的发现和处理工作。这是个没有硝烟的战场,我们与两万多名安全专家并肩而行,捍卫全球亿万用户的信息、财产安全。一直以来,我们怀揣感恩之心,努力构建开放的TSRC交流平台,回馈安全社区。未来,我们将继续携手安全行业精英,探索互联网安全新方向,建设互联网生态安全,共铸“互联网+”新时代。
- End -
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com