前言
主要是做了星盟的招新赛,内容很多且很难,借助了AI,一些知识点后面会再汇总出文章
ez_uds
题目给了算法逻辑,进入程序后发现给了如下提示
1 | ============================== |
输入我们输入27 01后程序回显67 01 74 EF CD D0,由于uds返还的规则是请求+0x40,那么0x27+0x40=0x67,所以我们就不用管67,直接得到逆向脚本如下
1 |
|
可得答案9c879a26
回显得
[+] Access Granted
polarisctf{dd4d3bdd-d3f6-4abd-8d48-f55ffbf8ac66}
illusion
一进来可以进入虚假的main函数,是RC4,解出来发现是虚假的flag,没思路就去查找字符串发现有real world,进入后发现是标准的AES-128,就能很快破解flag为xmctf{R3a1_w0rld_M47ters}
移动的秘密
进入后发现是少量正常语句和大量混淆,进入程序后找来找去发现MD5的标准初始化向量
xmmword_3060 xmmword 1032547698BADCFEEFCDAB8967452301h
初步怀疑为MD5加密
继续看可以看到xmmword_3070在最后的比较被引用了,大抵可以判断出是目标MD5密文,再看到有位移,至于后面的高度混淆的代码经查阅是MD5的标准处理。再看执行流
1 | if ( __isoc99_scanf("%29s", s) == 1 ) |
将我们的输入进行位移,与xmmword_3080与xmmword_3090进行对比,但这里与MD5无关,后面也没拿来调用,只是拿来混淆视听检验的,或者说这是爆破MD5时的约束条件,所以我们可以直接来逆向MD5,爆破可得flag
ezFinger
这道题由于我完全没有写固件的经验,所以我是AI一把梭的

hajimi
一道很抽象的题目不借助AI我完全没思路。打开后发现直接给了源码和一个未知的压缩包。源码中有语句
1 | VALID_DIGITS = set("1234") |
那大抵是只能输入1234。还能看到
1 | if len(prompt) != 16: |
那意味着我们输入的长度必须为16,我首先考虑爆破,但是爆破组合太多显然一个个试不是个合理的方案,询问AI,AI说这可能是一个4*4网格的数独。拿着就很好办了,我们直接爆破数独,AI给的爆破数独脚本如下
1 | from itertools import permutations |
太抽象太抽象了。
Hulua
进入程序查阅后发现有34个case和超过10位的小数,那肯定有问题,查找字符串可得
1 | @$LuaVersion: Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio $$LuaAuthors: R. Ierusalimschy, L. H. de Figueiredo, W. Celes $ |
可以直接锁定Lua解释器及其版本。然后就没思路了,但是查找字符串可以看到很多重复的lua,查阅并交叉引用后发现突破口
1 | unsigned __int64 sub_1400014A4() |
异或后可得lua字节码,将字节码编译为luac文件之后发现unluac怎么搞都搞不出来,顿感不妙,上网一查发现是这个luac被篡改了导致文件头长度缩短,notepad++也没用,没招了,给AI看给出逻辑,发现是魔改的RC4,就多了个0x66,key为xmctf2026,密文为0x8B,0x8B,0x77,0xBE,0x68,0x61,0x86,0x68,0xE5,0x63,0xEE,0x84,0x35,0x6F,0x58,0xC8,0x51,0x0F,0x6E,0x94,0x70,0xE7,0x26,0x90,0xB6,0x75,0xEC,0x28,0xAF,0x14,0xE2,0xE3
那这样就可以得到flag了,逆向脚本如下
1 |
|
MixTielele
一道很有意思的安卓逆向。进入jadx中,主逻辑看不到什么,native调用啥都都没看到,看主逻辑周围的逻辑发现出现SHA256字样和一个native层调用
1 | package com.example.titlele; |
调用了libflutter.so,解包看IDA。但是发现这个so文件的IDA不一样


出现了前所未有的选择界面,DIE看一眼

那就是apk伪装成so文件了,改后缀后还是jadx,发现定位不到主逻辑,开始乱翻,遍历完大部分功能后发现

发现lib文件中有一个so文件的名字与题目名字一摸一样,并且在mainactivity里被load了,丢进IDA,发现如下
1 | __int64 __fastcall AES(__int64 a1, __int64 a2, __int64 a3) |
发现调用了base64和AESCBC
1 | __int64 __usercall rsaEncryptKey@<X0>(const unsigned __int8 *a1@<X0>, unsigned int a2@<W1>, __int64 a3@<X8>) |
发现有RSA和base64。至此很多逻辑都出来了但是执行流还不知道,没找到数据也不知道怎么个逆向法,重新研究一遍。发现apk中调用了libflutter.so进行异或,处理完后回来又调用了一次base64,但后面的执行流和攻击手段我没研究出来,就给AI跑了一次,得到如下逆向脚本
1 | #!/usr/bin/env python3 |
easyre
第一次遇到这种双端调试的题,搞了很久,问了些师傅才勉勉强强做出来。
双端同时进入IDA动调,一步步步过,可以调到一些比较关键的输出地址。
首先可以在server的base+0x33650处下长度为0x20的读写断点,然后在client的main随便下一个断点,直接开跑一直步过可以得到

在这个地方会因为我们之前下的读写断点而停下来,一直F9可以得到

目标MD5值,解出来发现是ctfer,于是推出调试,退掉之前下的断点重新调试一次,按住F8不松手,等出现字符串的时候立刻松手F2下断点就可以找到

那么全都出了。