W4terCTF 2025 WriteUp - Thops's Barrier
回顾
第二次参加校赛,仍然是一个人。不过2024校赛的时候啥都不会,python都没怎么学,基本就是几个方向签了下到就结束了。
去年秋季参加了 NewStarCTF 2024 和 hackergame 2024,对Web和Misc方向有了一点点了解。这次校赛凭着兴趣打算试一试RE, 也是我第一次做CTF的RE题目。 由于之前只会一点点PE结构和x32dbg的调试,ida用的也还不算熟练,所以做题进度比较缓慢。做出来modern-lang(现代的语言)的时候真的很激动,但让我比较难受的是Hello Obfuscator没解出来,那道迷宫题reMazeR则没什么头绪。

Misc(1题)
签到问卷
F12打开开发者工具,查看network,flag就在这个meta开头的请求的响应体中
Reverse(4题)
网站管理员的登录密码
首先使用Wireshark分析backup.pcapng流量包,追踪HTTP请求,找到登录成功的请求和响应(状态码为200)
提取出加密后的密码
浏览器搜索了一下形式,可能是AES加密
接下来寻找加密逻辑,查看请求网页调用堆栈看见了onClick函数,点进去之后发现调用了x函数,追踪一下


确定就是是AES-CBC加密,parse的第一段是密钥,第二段是偏移,都是Hex格式,和加密后的密码一起放进解密工具得到flag
现代的语言
这道题是Rust反编译,但是我的做的时候没有使用插件。
第一次做逆向见到这种题目有点懵,直接运行了一下exe,控制台里面看起来每一位的有效输入和前面的输入有点关系,还挺好玩的(。猜测这道题肯定对输入进行了特殊处理,直接在内存区域检索“input”“scanf”之类的字样,检索到了check_the_whole_input这个函数,查看一下交叉引用,可以确定这就是校验函数,应该就是把整段输入做个加密和加密后的flag比对,这里发现“HackForFun”字样,可能是密钥什么的。
接着就是F5大法了,读了一下反编译的代码并且问了一下AI之后发现是标准的RC4加密,那么“HackForFun”应该是密钥。发现while循环验证密码,而&xmmword_1400AEA92是加密flag数组存储空间的起始地址,由前置的if条件“v7 >= 0x46”或者直接查看十六进制数据发现密文长度为70字节,也就是说flag长度是70位

注意ida默认小端序存储,解密如下
1 | from Crypto.Cipher import ARC4 |
和谐小APP
题目附件entry-default.hap,看来是一道类似apk逆向的题目
HarmonyOS官方文档查阅.hap文件的定义:
HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。
+entry:应用的主模块,作为应用的入口,提供了应用的基础功能。
+feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。
.hap文件结构如下:
使用鸿蒙hap应用反编译工具 abc-decompiler查看modules.abc.jadx,全局检索flag找到如下代码:
注意到20250428可能是密钥,猜测flag及其加密逻辑在libentry.so中,ida打开找到函数sub_1B80,可以确定v12就是密钥20250428,target数组存放密文,长度为128字节

解密如下:
1 | target_data = bytes([ |
Lite Obfuscator
拿到文件lite-obf,先使用DIE(Detect It Easy)查看格式,发现是ELF64格式,由C语言编写,直接使用ida打开:
进来看到main函数,看似简单直白,上来就是输入和加密处理比较flag,这里看到加密flag存储在命名为unk_30038的数组中,提取出来。接下来开开心心点开了sub_1465B函数,然后看到调用了一堆函数。


不用多说,接下来里面随便点进去一个都是继续调用一堆函数,看函数调用图即可(菜单栏View->Graphs->Function calls)。也许是某种不可名状的代码混淆技术,至少现在我还不知道这是什么混淆方式,反正一个个点进去完全不可能,但是选择一条点到底了之后发现是空函数体,多看了几条也是这样。也就是说运气好的话可能只有一层加密。

然后就开始费劲心思地去想怎么找到加密函数,想到一般的加密方法都有异或操作,直接全局搜索^,找到加密函数就是sub_F269,是标准TEA加密:

解密如下:
1 | import struct |