D3CTF-REVER-D3MUG
0x1 下载工具
Il2CppDumper(https://github.com/Perfare/Il2CppDumper)
FridaContainer(https://github.com/deathmemory/FridaContainer)
AssetStudioGUI(https://github.com/Perfare/AssetStudio)
Cheat Engine和ceserver_android_arm64
0X2ILL2CppDumper 还原符号表

新建两个文件夹 分别为input和output

把so文件和global-metadata放入input
global-metadata的路径assets\bin\Data\Managed\Metadata
然后新建一个bat里面输入 ..\Il2CppDumper.exe libil2cpp.so global-metadata.dat ..\output
点击bat运行

output中成功为如上图片

打开ida分析so文件,加载脚本

第一个选择output下的script文件

第二个选择il2cpp.h 一直等到还原结束
0x3分析函数和主要逻辑

打开output出来的字符串列表

ctrl+f 搜索D3CTF 查到关键地址

直接ctrl+x 查找引用

找到关键函数位置 ScoreScene_start 指向的红色位置为字符串D3CTF

进入其中的ScoreScene_get函数发现引用了d3mug中的get

查看d3mug的引用

发现GameManger_update 引用了 d3mug的update

再查找引用,发现是NoitHit 和NotMiss

hit函数中传入的可以看出是时间,判断出是游戏开始时右上角的时间

miss函数传入0 说明触发miss函数时传入0
0x4 查找音谱

加载apk解压下来的素材文件 然后搜索beatmap 发现和音乐名字一样的文件 导出音谱
0x5编写frida hook脚本

index.ts 中编辑hook脚本
var hitdata=[ ... ] //填入音谱
var count = 0;
function hook1(baseaddr:NativePointer){
var GameManager__NoteHit = baseaddr.add(0x62b64c); //基址加上函数偏移地址
var GameManager__update = baseaddr.add(0x62b4c0);
var ScoreScene__get = baseaddr.add(0x62ee40);
Interceptor.attach(GameManager__NoteHit,{
onEnter:function(args){
console.log("[H]",args[0],args[1],args[2],args[3]);
}
})
Interceptor.attach(GameManager__update,{
onEnter:function(args){
args[0] = ptr(hitdata[count]); //每次将音谱的时间传入
count +=1;
console.log("[U]",args[0],count);
}
})
Interceptor.attach(ScoreScene__get,{
onEnter:function(args){
console.log("[R]FINAL RESULT");
}
})
}
export function main(){
console.log('[.]Native hook');
var baseAddr = Module.findBaseAddress("libil2cpp.so"); //获取基址
hook1(baseAddr);
}
main();

然后使用 npm run build 编译成js代码
如果出现类型报错 进入tsconfig.json文件 搜索strict 改成false

0x6 frida连接
因为网上有许多的frida下载安装教程,所以就不再复述。

手机usb连接电脑 abd连接开启 server

再开启一个cmd 进行转发端口

可以输入frida-ps -U 来查询是否开启服务
进入FridaContainer-master cmd
frida -U -F com.DefaultCompany.com.unity.template.mobile2D –no-pause -l _fcagent.js
这里的包名 可以在手机打开游戏,命令中输入adb shell dumpsys window w |grep / |grep name= 来查找包名

然后先进入游戏不要start 运行脚本 再点击start

如出现以上内如即为成功 等游戏自然结束
0x7 CE查询内存得到flag
先将ceserver_android_arm64传入进手机(注意真机使用需要ROOT,至于怎么root,无关ctf了..)
举例 adb push ceserver_android_arm64 /data/..等


后直接运行起来即可

打开ce 需要电脑和手机同时在一个网段,如在一个wife下

后查找到软件的包名附加上去

搜索字符串D3CTF,然后复制地址

最终查看内存 得到flag 完成
D3CTF{Gb78e-7b04-4364-82d2-7f44}
0x8总结
在这里非常感谢nepnep战队中的TsThOd大师傅,全程教会我这些流程和关键步骤。砰砰砰!!
学习到了许多工具的使用和破解思路。