本题目是一道信息安全大赛上的安卓逆向题目,主要考察选手,逆向分析能力,
反汇编能力,安卓程序结构分析能力,以及常见的安全加密编码算法得能力。题
目下载 http://download.csdn.net/detail/bjtbjt/9846682可能部分步骤过于啰嗦,大
佬略过。方便入门者学习。这个题目拿到手是个安卓apk程序。下载下来,我们先
不着急进行分析。先对其程序apk安装测试一下,看看有什么功能和提示,或者了
解一下要求我们做什么。在这里呢, 不建议大家直接在自己的安卓手机上安装,
最好使用模拟器。我这里呢,使用的是模拟器。模拟器地址网上也很多,我自己
安装的是蓝叠模拟器
http://www.bluestacks.cn/
安装很简单,就是下一步。如果出现这个说明安装成功了。
然后把我们的程序添加到这个模拟器,本地安装APK点击选择,安装好即可。
我们测试一下题目,随便输入1234,发现验证失败。那么此题目输入正确答案
密码串。
到了这里,可以请出我们的安卓逆向神器,当然也有其它类似反编译器。
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
pass
if __name__ == '__main__':
print decrypt("=0HWYl1SE5UQWFfN?I+PEo.UcshU").decode("base64")
pass
output:
UhscU.oEP+I?NfFWQU5ES1lYWH0=
flag{ISCCJAVANDKYXX}
本次题目难度不是很大,主要是注意两个算法的分析。
一个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/