2023腾讯游戏安全安卓初赛复现
参考博客:
[原创] 腾讯游戏安全技术竞赛2023 安卓客户端初赛WriteUp-Android安全-看雪-安全社区|安全招聘|kanxue.com
[原创]2023腾讯游戏安全竞赛初赛题解(安卓)-Android安全-看雪-安全社区|安全招聘|kanxue.com
[原创]2023腾讯游戏安全大赛-安卓赛道初赛wp-Android安全-看雪-安全社区|安全招聘|kanxue.com
腾讯游戏安全大赛安卓2023初赛复现 | Blue.Blogs
2023腾讯游戏安全mobile端初赛wp - TLSN - 博客园
绕过调试检测
根据wp中的说法是检测了/data/local/tmp文件夹下的re.frida.server字符串,同时检测了默认端口。实际上检测的应该是tmp文件夹中的文件名,如果存在Android-server或者frida-server就会报错,同时检测了这两个服务器的默认端口。只要给他们改个名然后转发一下端口就可以正常运行游戏了。
先在adbshell中用指令:./fs -l 0.0.0.0:1234
在1234端口上启动frida-server,之后另开cmdadb forward tcp:1234 tcp:1234
转发端口,然后frida -H 127.0.0.1:1234 -f <package-name> -l Script.js
即可。
解包il2cpp
解压apk后找到libil2cpp.so与metadata,尝试用il2cppDumper解包,失败。ida打开ilbil2cpp.so后发现被加密过,会在运行时解密,这里可以写一个frida脚本hook运行时的ilbil2cpp.so并dump出来得到解密后的文件。这里用的[fallw1nd]师傅的代码。
1 | function WriteMemToFile(addr, size, file_path) { |
提示成功后pull出来,再使用il2cppDumper即可成功解包。
解包后的libil2cpp.so缺少了尾部的重定位表,直接将解包前的复制过来即可。
获得flag
找到相应函数
可以用il2cppDumper自带的脚本恢复libil2cpp.so的符号表。
然后在dump.cs中搜索coin,发现有个CollectCoin函数:
在ida中跳转到这个函数的va:
可以看到这样一个函数,有一处和1000进行比较的地方,猜测此处就是判断是否得到flag的位置。
修改程序逻辑
只要将1000改成0,即将逻辑从1000分给出flag变成0分给出flag即可。
代码:
1 | function PatchIncrease() { |
直接运行会如下报错:
原因是app刚启动时还没有加载libil2cpp.so这个文件,所以找不到,使用%reload
重新运行一下脚本即可。
然后随便吃一个硬币就能看到flag了。
实现注册机
分析 token生成逻辑
在dump.cs中可以看到有一个smallKeyboard类:
在恢复了符号表的so中找到相关函数:
写一个frida脚本