今年的比赛运气比较好,最终排名前20(学生潜力榜第四),到手2500大洋 ^-^

这次阿里的题出的比去年难得多了,到第三题各种so混淆,只能怪自己源码研究的还不够深,还得继续努力阿~

第一题

netbeans动态跟smali,在所有比较处下断点,经调试发现在45540行,v4固定为520676,并与计算过后的输入值作比较(v10):

ali1

当输入为1v10124751,输入为2v10124752,输入为3v10124753,根据递增的规律将输入改为395926即为正确答案。

第二题

1.绕过反调试

java层有一个签名校验,smali反编译后直接去掉即可绕过。sub_1284为反调试函数:

ali21

在函数开始时直接返回即可绕过:

ali22

运行时发现这样改有问题,sub_1284函数里面唤醒了另一个线程,所以不能直接返回。将if比较之前的R0值直接置为0即可绕过反调试,同时不影响程序的正常运行,修改之后入下图:

ali23

修改完之后发现运行时还会检测反调试,说明没有过干净,在text段中没有发现其他反调试的信息了(被加密过后的代码除外),说明未过干净的反调试在init_array段中。接下来分析init_array段,总共有7个函数:

ali24

经过调试发现前6个函数只是解密相关text段,在执行第7个函数时反调试被触发,跟进这个函数,发现以下代码:

ali25

红色表示往非法地址写入数据,所以程序崩溃,到此可以猜测if比较之前的sub_3400很有可能是反调试。nopsub_3400成功绕过所有反调试,可以随意跟代码了:

ali26

ali27

2.so脱壳

继续分析程序代码:

ali28

发现很多地方调用mprotect改内存权限,具体可以见ThomasKing 的《简单粗暴的so加解密》bs.pediy.com/showthread.php?t=191649&viewgoodnees=1&prefixid=,在这里为基于特定函数的加解密实现。mprotect函数是这类加解密的关键,所以最佳的脱壳点也即执行到mprotect的时候,于是动态调试时在mprotect上下断点,当LR(反回地址)为libwbox.so时,用dd扣出整段libwbox.so,最终脱出的so有十几个,一个个查看这些so就能找到所有解密过后的函数。

脱壳时机LRibwbox.so

ali29

3.逆向加密算法

壳脱完之后就可以分析加密算法了。首先对输入做如下操作:

ali210

从这里可以看出输入有16字节,对偏移为n的字节做加n处理,接下来将16个字节分别加上1de0中的值:

ali211

1de0中的值:

ali212

然后调用了一个动态分配在内存中的函数,这个函数由于是动态分配的,所以要运行到这个函数时才能动态将其扣出来:

ali213

扣出来的代码用ida arm架构模式反编译:

ali214

create function之后就可以看到这个函数的反汇编代码(这里要注意一点,扣出的函数中用到了一些存在函数代码之后的数据,所以在扣代码时要多扣一点):

ali215

ali216

这段代码其实不太容易看懂,他分别对每4字节做相关操作,中间还有一个10次的循环,并且输入输出都是128bit,非常像AES加密,在扣出的末尾还有一大段数据:

ali217

熟悉AES的就可以知道,这个是AESS盒了。接下来发现密钥是硬编码在里面的:

ali218

分析到这里,这个算法就基本搞定了。最后和正确的加密结果进行比较:

ali219

正确结果为:

ali220

AES解密结果为: 0x8a,0x1f,0x4b,0x6e,0x59,0xca,0xf2,0x52,0x05,0xca,0x27,0xde,0x04,0xc2,0xe9,0xdb

最后写段代码解出最后的答案:

 答案为:kboloy0(解密结果中含有不可见字符。。只需将前面可以可见字符提交即是答案。)

 

观看更多有关 的文章?

*

    2015年11月10日

    耀神刁刁哒~

      burningcodes
      2015年11月10日

      名字乱填就算了。。连邮箱都乱填( ¯ □ ¯ )

    LLL
    2015年11月20日

    你好,我也是研究android安全的,主要研究加固和漏洞利用,希望一起交流下。

      burningcodes
      2015年11月20日

      ^_^ 没问题哈,可以先邮件联系

+
跳转到评论