首页
社区
课程
招聘
看雪CTF2017 android-crackme逆向题目
2017-5-24 17:37 4614

看雪CTF2017 android-crackme逆向题目

2017-5-24 17:37
4614

        该题目主要是针对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分钟即可破解出三个字节的位置密钥(这里是需要攻击者从正面的思路来进行推测后分析得知的结果)。


     



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (11)
雪    币: 7415
活跃值: (2678)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2017-5-24 23:03
2
0
在安卓5.1  系统可以正常运行  所提供的flag可以成功注册

另外  上次在flag后面加任意字符都可以成功的  问题  已经不存在
雪    币: 416
活跃值: (42)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
liuluping 2 2017-5-31 10:05
3
0
好的收到!
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
poyoten 22 2017-6-25 13:49
4
0
多了Main中的假签名检查就能让人进入错误路径,不能理解。
唯一能让人进入错误路径是输入长度。
另外简单分析算法怎么能得出长度?根据>120?试想,如果输入是12位。des出来40位,最后一组的作为rc6的4bit  key就是固定的,理论上也是成立的。我想只有猜出是36位输入的能才做出来吧。只能猜测而已。
雪    币: 4752
活跃值: (2923)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
LeadroyaL 1 2017-6-25 23:13
5
0
poyoten 多了Main中的假签名检查就能让人进入错误路径,不能理解。 唯一能让人进入错误路径是输入长度。 另外简单分析算法怎么能得出长度?根据>120?试想,如果输入是12位。des出来40位,最后一 ...
我来回答一下:onCreate和onCreate(Bundle)是不一样的,你仔细看一下;所以Main.onCreate是从来没有被调用过的。
为什么猜出长度,我是通过4个4来猜的,因为明文没有对齐进行的PKCS5,就想到前面可能都是flag单表替换过的。
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
poyoten 22 2017-6-26 00:14
6
0
LeadroyaL 我来回答一下:onCreate和onCreate(Bundle)是不一样的,你仔细看一下;所以Main.onCreate是从来没有被调用过的。 为什么猜出长度,我是通过4个4来猜的,因为明文没有对齐 ...
学习了。我说我也写了个类似的apk试了下,原来没有注意到细节。谢谢。但是长度猜测这个应该不太确实吧。
雪    币: 4752
活跃值: (2923)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
LeadroyaL 1 2017-6-26 11:34
7
0
楼主您好,请问本文提到的“在反调试函数的最后一层会对程序中的最后比较硬编码数据进行动态修改。”这个在哪里,我在3个反调试函数中均为找到这样的代码,3个版本的so都看过了。还请明示
雪    币: 416
活跃值: (42)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
liuluping 2 2017-7-1 16:19
8
0
您好,非常抱歉,那个ppt有错误,那是之前上传了的。因为后来题目的长度设计时出了点问题,导致题目被重新修改过,在修改过过程中导致题目出了点问题,在最后在上传的题目中,那个反调试修改硬编码比较数据的地方也去掉了!不好意思,谢谢!
雪    币: 416
活跃值: (42)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
liuluping 2 2017-7-1 16:21
9
0
LeadroyaL 楼主您好,请问本文提到的“在反调试函数的最后一层会对程序中的最后比较硬编码数据进行动态修改。”这个在哪里,我在3个反调试函数中均为找到这样的代码,3个版本的so都看过了。还请明示
您好,非常抱歉,那个ppt有错误,那是之前上传了的。因为后来题目的长度设计时出了点问题,导致题目被重新修改过,在修改过过程中导致题目出了点问题,在最后在上传的题目中,那个反调试修改硬编码比较数据的地方也去掉了!不好意思,谢谢!
雪    币: 416
活跃值: (42)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
liuluping 2 2017-7-1 16:24
10
0
poyoten 多了Main中的假签名检查就能让人进入错误路径,不能理解。 唯一能让人进入错误路径是输入长度。 另外简单分析算法怎么能得出长度?根据>120?试想,如果输入是12位。des出来40位,最后一 ...
@poyoten,您好,不好意思,第一次出题,加上中间出了点小问题,导致题目设计上存在了点问题,关于长度问题,这个确实存在问题,至于Main.onCreate是确实设计来不会被调用的,只有onCreate(Bundle)才会被调用,至于猜测长度,由于题目的修改,导致了问题的产生,抱歉。以后一定努力做得更好!
雪    币: 416
活跃值: (42)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
liuluping 2 2017-7-1 16:25
11
0
LeadroyaL 楼主您好,请问本文提到的“在反调试函数的最后一层会对程序中的最后比较硬编码数据进行动态修改。”这个在哪里,我在3个反调试函数中均为找到这样的代码,3个版本的so都看过了。还请明示
您好,是您说的那样,题目中的那个猜测长度,存在问题,后来修改题目导致的,非常抱歉不好意思,从java层是无法得到最后长度的,导致了必须要暴力破解4个字节,抱歉抱歉。
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
poyoten 22 2017-7-2 16:09
12
0
liuluping @poyoten,您好,不好意思,第一次出题,加上中间出了点小问题,导致题目设计上存在了点问题,关于长度问题,这个确实存在问题,至于Main.onCreate是确实设计来不会被调用的,只有onCrea ...
客气了。我当时也是有点情绪,对事不对人的。可能我做的也有点过。抱歉。
游客
登录 | 注册 方可回帖
返回