dlive 发表于 2016-3-14 23:28

2016 0ctf - mobile - boomshakalaka writeup

本帖最后由 dlive 于 2016-3-14 23:51 编辑

         题目链接:http://pan.baidu.com/s/1jHa8cHC 密码:hj9h   首先在模拟器或者真机中安装一下apk看到是一个cocos2dx的打飞机游戏         根据题目提示,要打游戏打到最高分就会得到flag,首先拉到Jeb中反编译一下,在manifest文件中看到入口类为FirstTest类                  FirstTest类的onCreate方法调用了a类对flag和Cocos2dxPrefsFile字符串做了某些操作。         下面看一下a类的实现                  a中使用了SharePreferences并向其中写入一些数据,sharePreferences是android的一种数据存储机制,它会在/data/data/com.example.plane/下生成一个xml文件,并将数据存储在其中。         随便玩一下游戏之后,查看/data/data/com.example.plane/Cocos2dxPrefsFile.xml的内容:                  里面有一段base64的字符串,解码之后看到了0ctf{xxx的字符串,但是字符串并不完整,猜测flag是动态生成的,多次运行游戏并且获取不同分数后发现该文件中的base64长度随分数高低有所变化,所以flag和游戏分数高低有关                  在java层的代码中仅发现FirstTest类中有对SharePreferences的操作。         
         所以主要操作应该在so中,使用IDA对so进行反编译,发现so中两个与分数有关的函数               看了一下updateScore的代码,感觉已经很接近结果了,(可以动态调试一下以确定分数改变时会调用这个函数),这个程序生成flag的大概流程是,当游戏分数达到一定的分数段,就会输出一部分base64编码后的字符串。            所以我们只需要按分数的高低顺序将这些base64的字符串拼起来就是flag         之前我们在xml文件中的到的字符串是         0ctf{C0coS2d_AnDro1         在updateScore中得到的base64字符串为:MWRfRzBtRV9Zb1VfS24w         解码后: 1d_G0mE_YoU_Kn0   卧槽。。。flag不是完整的怎么办!!!         肯定还有其他调用SharePreferences的地方!   SharePreferences写数据的API是一样的,使用IDA的交叉引用找到其他调用API的地方,然后在其他调用处发现其他的base64字符串,从而得到完整的flag         0ctf{C0coS2d_AnDro1d_G0mE_YoU_Kn0w?}

dlive 发表于 2016-3-18 14:51

wdefault 发表于 2016-3-18 14:50
先码再看 文档能力有待提高

= =我觉得这个写的还好吧。。。挺详细的。。。

dlive 发表于 2016-3-18 14:58

wdefault 发表于 2016-3-18 14:56
你的关于详细的阈值有点低。。

真的没办法再详细了。。。。不信你写一个

0xxx 发表于 2017-5-9 14:12

题目链接挂了,想要个题目练练{:1_937:}

52lxw 发表于 2017-9-12 16:26

可以的,学习了哈

52lxw 发表于 2017-9-12 17:16

能重新给个链接不
页: [1]
查看完整版本: 2016 0ctf - mobile - boomshakalaka writeup