XCTF - 0CTF boomshakalaka wp

这是 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 接口写入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值