Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WMCTF2020-MISC-Dalabengba详解

WMCTF2020-MISC-Dalabengba详解

作者头像
回天
发布于 2023-04-25 07:23:35
发布于 2023-04-25 07:23:35
53000
代码可运行
举报
文章被收录于专栏:Ga1@xy's W0r1dGa1@xy's W0r1d
运行总次数:0
代码可运行

前言

整道题目的背景为达拉崩吧这首歌,在出题之前就想弄一道rpg的游戏题,苦于没有什么好的剧情构思,于是想到了达拉崩吧,非常完美的勇者斗恶龙剧情(手动滑稽),游戏中一些地图的设计和游戏剧情的构思都较完整的还原了达拉崩吧,所以其实在做题中没什么思路的时候可以去看看歌词对照一下2333

题目描述

Play game and get flag!

The flag was divided into three parts, the format is WMCTF{part1+part2=part3} .

题目详解

讲解视频:https://www.bilibili.com/video/BV1Tt4y1Q7yE

下载附件解压,可得一个exe文件,打开后发现报错,无法运行,所以首先我们需要将文件解包,检查其不可运行的原因,解题具体过程如下

解包

关于rpg游戏的解包,百度(谷歌)即可,我用到工具为 EnigmaVBUnpacker ,不过需要注意的是在解包后需要先修改文件夹的名称,不然含有 % 会导致游戏无法正常运行,其中 part2.jpgs3cr3t.crypto 两个文件分别对应了flag的part2、part3两部分

求key

解包后就可以看到一个完整的rpg游戏的内部文件结构了,打开 www 文件夹,其中全部都是有关游戏的文件,再打开其中的 img 或者 audio 可以发现其中文件都被加密,而有关加密的key信息在 data 文件夹的 System.json 中,打开后翻到最后发现 encryptionKey 一项中为空,所以需要先求得key

有关rpg文件解密,有相关工具 RPG-Maker-MV-Decrypter ,在GitHub里可以看到 工具源码,其中很详细的写了文件加解密原理,被加密文件开头被填充了固定的16字节(解密时需要移除)

而后属于原本文件的开头16字节与key进行异或,即完成了文件加(解)密

其中key也是长度为16字节,所以用rpgmaker新建一个项目,找到其中任意一个对应未被加密的文件,用其开头16字节与被加密文件的开头17~32字节xor,即可得到key

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = '4F 67 67 53 00 02 00 00 00 00 00 00 00 00 04 EE'.replace(' ','') 
b = 'B8 22 F5 61 8A 14 8C F8 58 E7 27 00 78 D4 F2 45'.replace(' ','') 
​ 
key = '' 
for i in range(0,len(a),2): 
    key += hex(int(a[i:i+2],16) ^ int(b[i:i+2],16))[2:].zfill(2) 
​ 
print key 
​ 
# f74592328a168cf858e7270078d4f6ab 

将得到的key写到 encryptionKey 中,即可正常打开游戏

游戏剧情

剧情大体和达拉崩吧中所描述的相同,首先诞生在城镇,去王宫和国王对话结束后即可开启冒险,其中城镇的 道具商店 中有一个hint,在最后会用到(不知道影响也不大)

总体路线为:城镇 → 森林 → 洞窟 → 美丽村庄 → 山洞 → 巨龙城堡

其中森林、洞窟、山洞、巨龙城堡都会遇到怪,怪的数量很多但大多数都可以逃跑(只有少数我自己加的怪无法逃跑2333),可以用CE修改器等外挂软件闯关,也可以手动闯关,其中在洞窟那个地图中有四根柱子,需要在每根柱子前按下确定键,才能激活通向下一个地图的传送门

我制作游戏时用的是 rpg maker mv ,用其新建一个项目,将解包得到的data文件夹替换新建项目的data文件夹,再打开项目也可以看到游戏的整体设计,但是一些关键信息都被加密,无法直接查看,只有在游戏中可以看到,或者想办法把它解密(就是不玩游戏的非预期解)

偏远美丽村庄中每一间能看到门房子都可以进去,其中宝箱里含有part2的hint,编号①~⑦,组合可以得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do you know java 

地图上也能看到part2的字样,提示此地图中含有part2相关的信息

最后在巨龙城堡3F打败巨龙(不用挂也可以打败)得到道具 巨龙的鳞片 ,再和公主对话后就会被传送回王宫,和国王对话可得到关键信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dwssap:54651A6252C6f5f653f55E62704f55F70395 
你需要先删去其中的大写字母 

其中 dwssappasswd 的倒序,逆序后去除大写字母,再 decode('hex') ,即可得到passwd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Y0u_@re_5o_bRaVE 

这个passwd用来解 s3cr3t.crypto

part1

再去 道具商店 即可看到魔女(之前在道具商店提到过hint),和魔女对话上交 巨龙的鳞片 后可以传送到 空中神殿 ,进入神殿内部,观察8个人物行走路径,可以得到 part1 部分flag,其中也有两个关于这部分flag的hint

触发hint条件:踩龙雕塑周围四个地砖中被圈起来的两个(要按确认键)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
如果没有什么头绪,不妨去镜子里看看帅气的自己! 
镜子有几面呢? 

在可以看到的五面镜子前按确认键都没有hint,所以想到在五面镜子的对面

在两个蓝色圈处按确认键即可分别得到这两个hint

人物行走轨迹如下图

再结合hint,得到part1部分: Pr1nCe5s (有些不太明显,多试几次就好)

当然这部分flag在替换data的新建项目中可以直接查看,人物行走路径的指令并没有被加密,所以可以直接根据指令将flag在地图中画出来(如上图),设计那些hint机关是为了给纯游戏(做题)的师傅们带来更好的游戏体验

part2

本部分flag的考点为 水印盲提取 ,在出这道题的时候,还没有进行安恒六月赛,在六月赛中给出了一道水印盲提取的题,用那道题的工具可以模模糊糊的看到本题图片中加了水印,结合在村庄中得到的hint: Do you know java ,在Google搜索 java 盲水印 ,可以在GitHub上找到一个 项目,用这个项目进行DCT模式图片水印解码,可以得到一个缺少中心识别码的 Aztec码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar BlindWatermark-master-v0.0.3.jar decode -c part2.jpg out.jpg 

将中心识别码补好后在线网站扫描,即可得到part2: W@rR1or

part3

文件后缀为 crypto ,Google搜索可知是用 Encrypto 这个工具加密,用刚刚得到的passwd解密后得到 s3cr3t.hidden 这个文件,直接Google关键词 s3cr3t ,就可以在GitHub上查到这个 项目,下载下来用其解密一下,即可得到part3部分flag

当然如果没get到工具的话也可以手撕加密(有好几支做出来的队伍都是手撕出来的,我也从中学习了下手撕的方法2333)

文本中有两种空白字符,分别替换成1和0,可以得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
100110101111011010101110000001000001011010000110011011101010011000000100011001101111011010101110011101100010011000000100100101100010111010000100100001001000010010000100100001001000010001010000 
01010000 
01010000 
01010000 
000011101000011001001110001011101100110001011100111010100001011001001110010010100100111001001110010011100111111001010000 

逆序解二进制,将得到结果再逆序,即可完成解密

flag

最终将得到的三部分flag按照格式拼在一起,即是最终的flag

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WMCTF{Pr1nCe5s+W@rR1or=WhrRrrr~} 

至于格式中为什么是 += ,也是为了更符合达拉崩吧的背景2333

总结

整道题比较难的地方在于最开始求得 encryptionKey ,之后的考点在网上都可以直接搜到,只要有足够的时间,完全可以解决本题,当然享受游戏也不失为一种解题方式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Effective Objective-C》干货三部曲(一):概念篇
本书是iOS程序员入门的必读书籍,它讲述了在iOS开发中(Objective-C语言)可以遵循的规范和一些开发技巧。
用户2932962
2018/08/30
9750
《Effective Objective-C》干货三部曲(一):概念篇
< Effective Objective-C>读书笔记
将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所需要引入的头文件的数量:
stringwu
2022/08/12
5130
《Effective Objective-C 》干货三部曲(三):技巧篇
继上一篇《Effective Objective-C 》超级干货三部曲(二):规范篇之后,本篇即是三部曲的第三篇:技巧篇。本篇作为三部曲的最终篇,归纳讲解的是本书中关于Objective-C开发的技巧性知识。
用户2932962
2018/08/30
7930
《Effective Objective-C 》干货三部曲(三):技巧篇
协议与分类--27:Class-continuation分类隐藏实现细节
xy_ss
2023/11/22
1670
iOS-代码规范
利用上周的业余时间把这篇规范整理了出来,我会将这篇规范作为我们iOS团队的代码规范,并且还会根据读者的反馈,项目的实践和研究的深入做不定时更新,还希望各位朋友看了多多指正和批评。
用户1740424
2018/07/23
2.3K0
iOS-代码规范
Objective-C Runtime 的一些基本使用
在上一篇文章《Objective-C Runtime详解》中我们探讨了Runtime的基本原理,这篇文章我们将总结一下Runtime的一些基本使用 目录 查询方法 给分类添加属性 更换代码的实现方法 动态添加方法 字典转属性 先创建两个类 ClassA.h #import <Foundation/Foundation.h> @interface ClassA : NSObject { // 公有变量 NSString *_publicVar1; NSString *_publ
BY
2018/05/11
1.2K0
面经之《招聘一个靠谱的iOS》import "CYLBlockExecutor.h"import "CYLBlockExecutor.h"import "CYLNSObject+RunAtDeallo
什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: de
rectinajh
2018/05/17
1.1K0
iOS中的Category
xy_ss
2023/11/22
2100
iOS中的Category
iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法
三读Objective-C2.0 笔记~(作为一个OC开发者,必读之书) gitbook地址
mikimo
2022/07/20
1.2K0
iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法
[Objective-C] KVC 和 KVO
KVC是一种用间接方式访问类的属性的机制。比如你要给一个类中的属性赋值或者取值,可以直接通过类和点运算符实现,当然也可以使用KVC。不过对于私有属性,点运算符就不起作用,因为私有属性不暴露给调用者,不过使用KVC却依然可以实现对私有属性的读写。
wOw
2018/09/18
7260
Objective-C Copy
前提是实现NSCopying协议的copyWithZone:方法,否则会导致出现找不到selector的崩溃。**unrecognized selector sent to instance**
Helloted
2022/06/07
5300
Objective-C Copy
objective-C中的序列化(serialize)与反序列化(deserialize)
obj-c中有一类对象:NSArray,NSDictionary,NSString,NSNumber,NSDate,NSData以及它们的可变版本(指NSMutableArray,NSMutableDictionary...这一类) ,都可以方便的将自身的数据以某种格式(比如xml格式)序列化后保存成本地文件。 示例代码:NSArrayTest.h #import <Foundation/Foundation.h> #define FILE_NAME @"/tmp/data.txt" @interface
菩提树下的杨过
2018/01/22
2K0
objective-C中的序列化(serialize)与反序列化(deserialize)
iOS - 代码Review (三)
一·实例变量的属性Setter&Getter 对象内部访问属性 @interface Test : NSObject @property (nonatomic, copy) NSString *firstName; @property (nonatomic, copy) NSString *lastName; @end @implementation Test - (NSString *)fullName { return [NSString stringWithFormat:@"%@ %@",
Wilbur-L
2021/10/29
4740
iOS中setter方法 、getter方法、点语法、@property
属性是OC的一项特性,用于封装对象中的数据 OC对象通常会把其所需要的数据保存为各种属性 属性通过存取方法来访问(setter、getter)
xy_ss
2023/11/22
3510
协议与分类--24:分类(Category)
Category也称为分类、类目、类别等,Category可以在不修改原来类的基础上,为这个类补充一些方法
xy_ss
2023/11/22
2320
工匠人iOS 代码规范
在多个不同的运算符同时存在的时候应该合理使用括号,不要盲目依赖操作符优先级。 因为有的时候不能保证阅读你代码的人就一定能了解你写的算式里面所有操作符的优先级。
用户3098942
2020/09/14
1.1K0
工匠人iOS 代码规范
关于Objective C编码规范,这些你一定要会
背景:这里有些关于编码风格Apple官方文档,如果有些东西没有提及,可以在以下文档来查找更多细节:
iOSSir
2019/06/14
4710
GB代码规范1.0
对于如果导入是UIKit类就使用UIKIT_EXTERN 如果是Founction使用关键词FOUNDATION_EXTERN
君赏
2018/08/31
1.3K0
oc深坑測试题及其答案[通俗易懂]
一、选择题(共80题,每题1分) 1、 不会立马使引用计数器改变的是: 答案:(C) A、release B、alloc C、autorelease D、retain 2、 在OC中类的接口声明keyword为: 答案:(B) A、@import B、@interface C、@implemention D、@protocol 3、 NSString *name = [[NSString alloc]initWithString:@”张三”];NSLog(@”%d”,[name retainCount]);上述代码打印结果是: 答案:(A) A、-1 B、0 C、1 D、2 4、 下列选项中所有属于对象的是: 答案:(C) A、我的白色iPhone4s;Mac Mini B、狗;老虎 C、邻居家的猫咪“贝贝”;我的弟弟“张三” D、保时捷;犀利哥 5、 NSDictionary *dict = [NSDictionary dictionaryWithObject:@”a value” forKey:@”aKey”];NSLog(@”%@”,[dict objectForKey:@”aKey”]);[dict release];控制台中打印的最后一条信息会是: 答案:(C) A、a value B、aKey : a value C、崩溃信息 D、a value : aKey 6、 现有例如以下集合,能准确删除“张三”的代码是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@”张三”,@”左护法”,@”李四”,@”右使”,@”唐sir”,@”老大哥”, nil]; 答案:(A) A、[peoples removeObjectForKey:@”左护法”]; B、[peoples removeObject:@”张三”]; C、[peoples removeObjectAtIndex:0]; D、[peoples removeAllObjects]; 7、 关于类和对象的概念,下列属于对象的是: 答案:(C) A、奥迪A6 B、保龄球 C、世界冠军刘翔 D、西红柿 8、 下面说法不对的是: 答案:(A) A、nonatomic:提供多线程保护,提高性能,在没有使用多线程的编程中能够选择使用。 B、assign:属性默认值。说明设置器直接进行赋值。针对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等。
全栈程序员站长
2022/07/07
4830
JSONModel源码解析 原
    做移动端开发,解析网络数据是必不可少的工作之一。iOS原生框架很早前就已经提供了将JSON数据直接映射成数组或者字典对象的方法,并且结合KVC,也可以将字典数据直接赋值给对象。但是这种方式十分不灵活,例如如果网络数据中的字段与我们数据模型中的字段不一致,某些网络数据的字段可能为nil等等都需要开发者单独的处理。使用JSOMModel可以十分方便的处理映射过程中的各种情况。
珲少
2018/08/15
1.4K0
JSONModel源码解析
                                                                            原
相关推荐
《Effective Objective-C》干货三部曲(一):概念篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验