D3CTF-D3MUG


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 还原符号表

1

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

2

把so文件和global-metadata放入input

global-metadata的路径assets\bin\Data\Managed\Metadata

然后新建一个bat里面输入 ..\Il2CppDumper.exe libil2cpp.so global-metadata.dat ..\output

点击bat运行

3

output中成功为如上图片

4

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

5

第一个选择output下的script文件

6

第二个选择il2cpp.h 一直等到还原结束

0x3分析函数和主要逻辑

8

打开output出来的字符串列表

9

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

11

直接ctrl+x 查找引用

12

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

13

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

14

查看d3mug的引用

15

发现GameManger_update 引用了 d3mug的update

17

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

18

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

19

miss函数传入0 说明触发miss函数时传入0

0x4 查找音谱

7

加载apk解压下来的素材文件 然后搜索beatmap 发现和音乐名字一样的文件 导出音谱

0x5编写frida hook脚本

20

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();

21

然后使用 npm run build 编译成js代码

如果出现类型报错 进入tsconfig.json文件 搜索strict 改成false

22

0x6 frida连接

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

23

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

24

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

25

可以输入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= 来查找包名

27

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

26

如出现以上内如即为成功 等游戏自然结束

0x7 CE查询内存得到flag

先将ceserver_android_arm64传入进手机(注意真机使用需要ROOT,至于怎么root,无关ctf了..)

举例 adb push ceserver_android_arm64 /data/..等

28

29

后直接运行起来即可

30

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

31

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

32

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

33

最终查看内存 得到flag 完成

D3CTF{Gb78e-7b04-4364-82d2-7f44}

0x8总结

在这里非常感谢nepnep战队中的TsThOd大师傅,全程教会我这些流程和关键步骤。砰砰砰!!

学习到了许多工具的使用和破解思路。


文章作者: Blue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Blue !
评论
  目录