这是 0CTF2016 年的题,可能出题人那会在研究 cocos 和移动游戏,时过境迁 cocos 已经不用 cpp 了令人感叹
这题我自己不会,看的网上的 wp。基本上都是瞎猫碰上死耗子,搜到关键函数找规律逆向判定逻辑,解出来 flag 完事。没人是真的从事件循环啥的入手解的 flag
解题思路
1. 从提示里得知 score 比较重要,搜索 score 找到 updateScore 函数
2. 玩几把游戏发现 SharedPref 的 xml 路径下,`Cocos2dxPrefsFile.xml` 内,DATA 字段的值在有规律性变化。恰好是 updateScore 里更新的字符串
3. 正常玩的话,高分段的字符串会覆盖低分段的,但都不完整,把他们按分值高低拼起来才对。
调用链分析
re学习笔记(90)攻防世界 - mobile进阶区 - boomshakalaka-3_攻防世界boomshakalaka-优快云博客
从 updateScore 开始分析比较容易。该函数的 caller 是 update。在 cocos 中。每一帧引擎会调用 update 函数触发代码层更新关联状态。
观察 update 函数,会遍历每一个 enemy,计算 boundingbox,检查有没有和子弹 rectIntersec,并判断血量,然后 updateScore
enemy_arr = (Enemy **)v8[2];
v187 = (unsigned int)&enemy_arr[v9 - 1];
v175 = enemy_arr;
while ( (unsigned int)v175 <= v187 )
{
enemy = *v175++;
if ( !enemy )
break;
(*(void (__fastcall **)(_BYTE *, cocos2d::CCObject *))(*(_DWORD *)v18 + 356))(v193, v18);
Enemy::getBoundingBox((Enemy *)v194);
if ( cocos2d::CCRect::intersectsRect((cocos2d::CCRect *)v193, (const cocos2d::CCRect *)v194)
&& Enemy::getLife(enemy) == 1 )
{
Enemy::loseLife(enemy);
cocos2d::CCArray::addObject(v2, v18);
cocos2d::CCArray::addObject(v162, enemy);
v11 = (cocos2d::CCUserDefault *)*((_DWORD *)this + 71);
v12 = (const char *)(*((_DWORD *)this + 76) + 100);
*((_DWORD *)this + 76) = v12;
ControlLayer::updateScore(v11, v12);
}
此外,update 里还控制着子弹的创建与销毁,音频,等等
值得注意的是,写 sharedPref 的逻辑定义在 java 的 org/cocos2dx/lib/Cocos2dxHelper 里,通过 安卓框架的 shared_pref 接口写入。
5169

被折叠的 条评论
为什么被折叠?



