本文为 Android CTF 系列的第1 篇文章,祝您阅读愉快。
本系列文章的目的为:在读者拥有一定编程/代码审计知识的情况下,使读者拥有解出大多数Android CTF题的思路。如读者对系列中提到的工具或知识不了解,可以点击下方合集查看往期文章,您需要的所有内容都在此处。
如您喜欢,请点赞在看关注,这是对笔者的最大支持,也是让笔者加速更新的动力源泉。
开源是一种精神,它为自由平等而生。
维护一个共享、有序、安全、开源、高质量、低抄袭的技术学习环境,人人有责。
周五了就不整活了,祝大家看得愉快。本期对无基础的同学也很友好,只需要你阅读了我之前写的基础指北一:
哪怕没有阅读,会使用前期准备中的工具也够了。
1 前期准备
作为系列的第一篇文章,写点指引是必要的。
在CTF比赛中我们通常需要准备三种类型的工具:
-
模拟器
-
APK源码读取工具(Jadx、GDA、jeb)
-
反编译工具(apkTool)
自然,如果是比较困难的题,可能还需要:
-
so反编译工具(IDA)
-
Hook工具(frida)
-
so主动调用环境、脱壳工具等...
由于CTF题中很少有网络调用,基本不需要额外准备抓包工具,需要注重的是对代码逻辑的分析以及混淆破解、脱壳。
2 读题-确定方向
纯Java题。
先使用模拟器运行附件,可以看到是一个校验密码的APP:
顺带看一眼代码,明显无混淆,看来重点是读代码:
对于这种情况,首先的方向肯定是找到校验密码的逻辑,密码可能为flag。
同时,由于GDA对匿名类处理较好(Java事件处理对象通常会是个匿名类),所以这种会用上事件的APP优先看GDA。当然,Jadx和GDA同时使用是最好的,因为Jadx同时也能看资源+有时候反编译的逻辑会有问题。
3 找到第一个pass
这里简单看一下两个Activity的匿名类(实际就是看onClick)可以找到校验逻辑,为Check类的checkPassword函数:
转向checkPassword函数,对此函数进行分析即可:
可以看出,pass为长度12的字符串,每个成员满足char(255-100-index-pass[index])=‘0’,一个简单的数学问题。
简单写个脚本解出了password,并不是flag,看来要进一步查找:
li=[]
for i in range(12):
li.append(chr(107-i))
print(li)
pass为kjihgfedcba`
4 定位第二个Activity
输入pass到文本框,进入第二个Activity:
经过一番定位,定位到现在出现的Activity为NextContent(一些Intent与Boardcast机制,详情请百度,一两句话是讲不清楚的):
5 获取flag
主要逻辑在Change内:
可以看到判断文件img.jpg存在时使用此文件,不存在时使用timg_2.zip。
由于逻辑内未使用文本框内容,推测是需要直接打开timg_2.zip。由于这里读取两个文件的方式相同,第二个文件也应使用jpg格式打开。
使用解压缩工具直接解压APP,找到timg_2.zip并修改后缀为jpg打开,获得flag:
Flag为flag{08067-wlecome}。
原文始发于微信公众号(重生之成为赛博女保安):一文入门AndroidCTF:以攻防世界#基础Android为例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论