CTF--信息技术对抗赛ISCC之安卓逆向分析

来源:互联网 发布:淘宝下单微信全额返现 编辑:程序博客网 时间:2024/05/02 00:33

0x01 题目介绍


    本题目是一道信息安全大赛上的安卓逆向题目,主要考察选手,逆向分析能力,

反汇编能力,安卓程序结构分析能力,以及常见的安全加密编码算法得能力。题

目下载 http://download.csdn.net/detail/bjtbjt/9846682可能部分步骤过于啰嗦,大

佬略过。方便入门者学习。这个题目拿到手是个安卓apk程序。下载下来,我们先

不着急进行分析。先对其程序apk安装测试一下,看看有什么功能和提示,或者了

解一下要求我们做什么。在这里呢, 不建议大家直接在自己的安卓手机上安装,

最好使用模拟器。我这里呢,使用的是模拟器。模拟器地址网上也很多,我自己

安装的是蓝叠模拟器


http://www.bluestacks.cn/




安装很简单,就是下一步。如果出现这个说明安装成功了。




然后把我们的程序添加到这个模拟器,本地安装APK点击选择,安装好即可。

我们测试一下题目,随便输入1234,发现验证失败。那么此题目输入正确答案

密码串。






0x02 解题要点


    到了这里,可以请出我们的安卓逆向神器,当然也有其它类似反编译器。

apktool,jd等之类的工具。JEB我这里是jeb 2.2.7破解版。载入我们的apk程

序进行分析。





通过关键按钮菜单,我们进行手动分析。和反编译部分函数和模块。由于刚才的

安卓程序有个按钮和编辑框。因此必须找到这个关键点位置。如下:onClick事件

就是负责处理验证密码过程。





前面绿色的数字ID就是按钮编辑框的标识,主要观察这个验证过程。对于用户的输入

这个程序先进行了。



此处把用户输入进行了字符串转化,然后去除空格。进行了encode函数编码。到底这是

个什么算法,还得跟踪Digest这个类对象的定义。先别着急分析编码函数,我们继续看

下面的代码关键点有个checkFlag函数进行了正确与否的验证,因为后面的输出判断刚好

有失败和成功之分。




这个函数呢,有声明,但是没有具体定义实体。为什么呢,因为这个是个内部JNI函数。

科普一下 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他

语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的

Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互

操作。


http://www.cnblogs.com/hoys/archive/2010/10/28/1863612.html

http://www.2cto.com/kf/201308/232666.html


到这里基本上就算是验证结束。那么我们看到了其中经历两个验证函数。一个是encode,

一个是checkFlag函数。只要分析清楚这两个函数,那么我们就直接可以进行反推,逆向

分析算法获取结果。


先来看看第一个函数encode




看编码和基本操作,好像是个base64,这个为了高校简单起见,我们可以直接验证这段java代码类。

自己编辑测试个字符串即可。




找个bas64算法验证一下。




验证成功。


下面我们关注第二个函数算法

既然是个内部函数,那么我们看看它在哪,其实我们可以从内部导出这个库文件,存储为*.so




然后单独ida分析这个iscc.so库。




关键函数checkFlag定位




关键静态密文字符串




分析算法






这里面将用户输入的字符串重新复制了一份,然后操作
先将用户输入的字符串按照长度分割成两半
把前一半字符串中的字符按照从左到右的顺序取出来
ASCII码减去 5 , 然后与后半个字符串与之对应的位置进行交换。

最后是比较加密结果是否等于我们静态存储的密文。

=0HWYl1SE5UQWFfN?I+PEo.UcshU

完全一致返回真,否则返回假。

基于此算法,我们就可以手动编写逆向算法了。


'''@author: 5t4rk'''def decrypt(cipher_string):    try:        plain = list(cipher_string)        plain.reverse()        print ''.join(plain)        for i in range(0, (len(plain) / 2)):            plain[i] = chr(ord(plain[i]) + 5)        return''.join(i for i in plain)    except Exception , e:        print e        passif __name__ == '__main__':    print decrypt("=0HWYl1SE5UQWFfN?I+PEo.UcshU").decode("base64")    passoutput:UhscU.oEP+I?NfFWQU5ES1lYWH0=flag{ISCCJAVANDKYXX} 


0x03 学习总结


    本次题目难度不是很大,主要是注意两个算法的分析。

一个base64一个逆向置换编码

必须找到关键checkFlag函数。


参考点:

http://www.2cto.com/kf/201308/232666.html

http://blog.csdn.net/lovoo/article/details/51429303

http://www.cnblogs.com/hoys/archive/2010/10/28/1863612.html

http://blog.csdn.net/jiangwei0910410003/article/details/49336613/


原创粉丝点击