静态分析 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