作为一个web狗,一道web都没做出来Orz。。。做出来一道apk,纪念一下在ctf中做出的第一道apk。。。

首先在模拟器或者真机中安装一下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的地方!写文件的API是一样的,使用IDA的交叉引用找到其他调用API的地方,然后得到完整的flag

0ctf{C0coS2d_AnDro1d_G0mE_YoU_Kn0w?}

最新文章

  1. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
  2. linux路由配置负载均衡
  3. Xamarin 中开发Android实现全屏或者不显示标题栏的方法-宋兴柱
  4. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
  5. hadoop-2.0.0-mr1-cdh4.2.0源码编译总结
  6. 6_StopWatch
  7. POJ 1118 Lining Up
  8. AVFoundation(二)---MPMusicPlayerController
  9. 【2017-04-21】Ado.Nte属性扩展
  10. Dynamics CRM2016 Web API之更新记录的单个属性字段值
  11. 在阿里云 ECS 搭建 nginx https nodejs 环境 (一、 nginx)
  12. Mac mumu模拟器设置代理
  13. Ado.net之存储过程的使用【三】
  14. iOS开发如何学习前端(1)
  15. maprduce 中reduce数量
  16. Spring MVC 学习)——控制器与@RequestMapping详解
  17. WP8.1 页面跳转,overwrite后退键
  18. pythonDjango开发-安装第三方插件
  19. 【Android】3.17 示例17--周边雷达功能
  20. TagsView.vue

热门文章

  1. Apache配置手札
  2. centos
  3. URLConnection类介绍
  4. Oracle数据库的创建以及远程连接(PL/SQL Developer远程连接数据库)
  5. 剑指offer 面试题65 滑动窗口的最大值
  6. Linux下压缩音频文件
  7. vim2
  8. jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法
  9. 神经网络和Deep Learning
  10. SpringBoot源码解析:tomcat启动分析