-
-
看雪CTF2017 android-crackme逆向题目
-
发表于:
2017-5-24 17:37
5203
-
看雪CTF2017 android-crackme逆向题目
该题目主要是针对Android的上crackme而设计。整体设计思路中规中矩,在传统技术上稍加进行了修改。随着android攻防技术的发展,传统的dex混淆加壳以及反调试混淆已经很容易被破解掉。现在主流的思路是对so进行混淆,从而增加破解者的难度,此题在设计上考虑到分析算法以及一些小的陷阱,程序分析工作量较大,没有将相关的代码进行混淆。
本地设计上分为java和native层两方面,在java层主要设计是进行设置了一些陷阱,以迷惑攻击者。首先是对MainActivity进行了隐藏,从而使得程序不执行配置文件中的MainActivity。其次是在MainActivity中添加了多余的迷惑解题者思路的签名验证,但是实际上却没有执行。需要攻击者认真细致分析,否则会走入错误的路径。在java层的算法设计上,有三个算法函数,三个函数都会被执行,但是只有其中一个会起作用。但实际上执行的只是其中一个,该函数的密文于输入长度有关,需要攻击者根据算法分析来对输入位数进行相关的判断。
在Native层,对dex文件进行了检测,防止作者对dex修改后添加log信息。其次进行了调试检测,这里调试检测设计时设计了较多层的函数调用,在反调试函数的最后一层会对程序中的最后比较硬编码数据进行动态修改。如果攻击者粗心,直接nop掉将会得到错误的信息。算法上,设计了两层加密算法,分别是DES和RC6两种加密算法,在算法设计中都是标准算法,其中只有对RC6算法中的一个参数Q进行了改动,这个攻击者只要分析程序就可以看出,不过需要细心,而DES则完全是标准的设计。在程序的密钥设计上有一些小小的设计,其中DES的密钥固定程序中,而RC6的程序会根据第一次DES加密后的最后一组取出4个字节来动态替换掉,这里有个问题需要说明:由于RC6的密钥会被DES加密的最后一组中取出4个字节来替换,由于输入未知视乎无解,但其实题目已经告知了flag的前8个字节的形式,因此经过java层以及DES加密后也是固定的,因此作者在解题时需要暴力破解RC6密钥中未知的4个字节,通过将最后硬编码比较的前16个字节进行解密后比较前8个字节是否为固定值来作为暴力破解成功的参考。此外这个地方从表面看上需要破解四个字节,似乎会违反题目的规则,如暴力破解时间在P4机上上不得超过一个小时。但是这里有一个小技巧,如果攻击者认真分析了了flag的长度以及最后进行DES padding的方式,则会发现进行DES加密的最后一组其实只有3个字节未知,而最后一组经过DES加密后又取了4个字节来作为RC6的密钥,因此从正面进行推到,只需要破解3个字节而不需要破解4个字节。这样设计的另外一个思路是程序中使用的RC6密钥和输入有关,因此可以很好的对抗符号执行等现在高级程序分析方法。
纵观整个题目,都是一些中规中矩的思路和算法,只是其中设置了若干的小陷阱,需要攻击者认真分析,仔细揣摩题目的思路,即可破解。题目所设计的内容都经过考虑,其分析量满足两天的破解时间需求。暴力破解时间也经过严格测试,普通机器上不到10分钟即可破解出三个字节的位置密钥(这里是需要攻击者从正面的思路来进行推测后分析得知的结果)。
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!