第十二题《移动迷宫》在今天(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 团队赛 解题思路汇总: