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大师傅,全程教会我这些流程和关键步骤。砰砰砰!!
学习到了许多工具的使用和破解思路。