静态分析 java 层例子
2014 tinyCTF Ooooooh! What does this button do
确定文件类型
通过linux的file命令可以看出该文件是一个压缩包,解压打开发现它其实是一个apk文件。
安装apk
安装文件之后,查看一下

可以看出其就是输入一个字符串,然后应该会弹出结果。
查看程序
在主程序中,可以发现,如果我们输入的字符串为EYG3QMCS就会执行flagActivity.class。那么我们输入一下,可以得到如下结果

即得到flag。
2014 ASIS Cyber Security Contest Finals Numdroid
判断文件类型
首先利用file判断一下文件类型,发现是个压缩包,解压缩一下,得到对应的文件,然后继续看一下,发现该文件是apk文件。
安装程序
安装一下程序。简单看一下页面,可以发现程序主要是输入密码,然后登陆。如果输入错的话会爆出“Wrong Password”的信息。

分析程序
根据相应的字符串来定位一下源程序中的关键函数。根据strings.xml可以发现该字符串的变量名为wrong,继而我们找到了如下代码。
继续定位到Verify.isOk中。如下
可以发现程序主要是取password的前7位进行OneWayFunction加密,然后与be790d865f2cea9645b3f79c0342df7e进行比较。如果相等就会返回true。这里我们再看一下OneWayFunction,如下
函数大概就是执行了几个hash值,但是自己去分析的话,太过于复杂,,由于本题的答案空间($10^7$)比较小,所以我们可以把verify类中的方法拿出来自己暴力跑一下。
构造程序
提取出java程序之后,在Verify类中添加main函数并修复部分错误,从而得到对应的答案。
这里对应的代码放在了example对应的文件夹中。
需要注意的是,这里如果对应的hash函数不存在的话,源程序会跳过对应的函数。我直接全部跑没有找到,然后去掉了一个不常见的MD2算法,从而得到了答案。这说明android应该是没有md2算法的。
输入之后得到如下

然后我们计算对应的MD值,从而获得flag为ASIS_3c56e1ed0597056fef0006c6d1c52463。
2014 Sharif University Quals CTF Commercial Application
安装程序
首先,安装程序,随便点了点按钮,在右上方点击按钮会让我们输入key

随便输入了下,发现程序直接报错,告诉我们不对,那么我们可以根据这些信息来进行定位关键代码。

定位关键代码
我们发现,其实 MainActivity.NOK_LICENCE_MSG就存储着报错的字符串信息,再继续读一下发现程序使用
来进行验证,如果验证通过就会跳出成功信息。
详细分析
进而我们仔细分析一下这三个参数。
参数1
参数1其实就是我们输入的字符串。
参数2
是利用函数来获取getSecurityKey,我们简单阅读一下,可以发现程序在getConfig函数中设置了SecurityKey
其中,函数首先进行了数据库访问,SELECT_QUERY如下
同时,我们可以得到该数据库的路径。
在进一步分析,我们可以发现程序在这里首先获取了表config的首行,然后将iv设置为第四列的值,key设置为第5列的值。
参数3
其实,参数3类似于参数2。这里就不做说明了。
获取数据库文件
首先,我们需要将该apk文件装到手机上,然后利用如下指令获取
进而使用电脑上可以查看sqlite的软件查看一下,这里我使用的是http://sqlitebrowser.org/。如下

这里,我们可以直接得到
分析加密代码
可以看到程序首先使用了encrypt函数对三个字符串加密。其实就是利用上面所说的AES/CBC/PKCS5Padding方法加密,将str2作为key,将str3作为初始向量。那么我们可以很容易地添加解密函数如下
然后运行得到正常输入的product key
2015-0CTF-vezel
分析
首先,分析代码,如下
可以看出我们想要的flag的分为两个部分
String.valueOf(this.getSig(this.getPackageName()))
this.getCrc()
其中第一部分,我们可以采用自己编写一个app来获取对应的值。第二部分我们可以直接将dex文件提取出来,利用网上的工具计算一下。
hashcode
随便找了个(放在对应的example文件夹下)
然后再ddms中过滤出hashcode
注:其实这个程序可以写成一个小的app,很多程序都会计算签名。
classes.dex crc32
随便找个在线网站获取一下classes.dex的CRC32值。
需要注意的是,这里需要转成十进制
flag
两部分算完合起来就是Flag
Flag:0ctf{-1839715371189242199}
2017 XMAN HelloSmali2
给的是一个 smali 文件,我们可以按照如下思路来做
利用 smali.jar 将 smali 汇编为 dex 文件。
使用 jadx 反编译 dex,如下
简单看一下,其实是一个变种的 base64 加密,我们可以在网上找一个 base64 编码,然后设置一下就好了,这里使用的脚本来自于 http://www.cnblogs.com/crazyrunning/p/7382693.html。
结果如下
题目
GCTF 2017 Android1
GCTF 2017 Android2
ISG 2017 Crackme
XMAN 2017 mobile3 rev1
Last updated