ZCTF Android1-200题解
来源:互联网 发布:poi的软件 编辑:程序博客网 时间:2024/05/22 05:11
首先对APK的Java层代码进行分析.入口的逻辑在Login.attemptLogin函数中该函数调用Auth.auth对用户名密码进行校验.
此处校验有一个读取数据库的函数databaseopt,其逻辑就在下边定义,但是其实不用看,key.db文件就在程序目录中,用随便一个数据库查看器可以看到唯一的键值
所以,auth函数参数0=context,1=yonghuming+mima,2=”zctf2016”
下面分析Auth和auth逻辑.
Auth有auth,encrypt和decrypt三个函数,后二者是des加解密.auth的逻辑恢复的有些混乱,分析得到黄色部分需要与apk资源中的flag.bin内容进行比较.用python对flag.bin进行des解密还原.盗用程序自带的DES解密,得到结果
public static void main(String[] args) throws Exception { String password = "zctf2016"; File file = new File("C:\\Users\\hyrathon\\Desktop\\Solve\\Android1\\assets\\flag.bin"); FileInputStream fileInputStream = new FileInputStream(file); byte[] str= new byte[fileInputStream.available()]; fileInputStream.read(str); byte[] ans = decrypt(str, password); System.out.println(new String(ans));}public static byte[] decrypt(byte[] src, String password) throws Exception { SecureRandom v3 = new SecureRandom(); SecretKey v4 = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(password.getBytes())); Cipher v0 = Cipher.getInstance("DES"); v0.init(2, ((Key)v4), v3); return v0.doFinal(src);}
}sihttoN{ftcz,根据原来程序的逻辑,这段是取逆之后的用户名加密码即原来应该为zctf{Notthis},用户名为zctf,密码{Notthis}.到此这部分结束.这一部分目前没有什么影响,因为不计算密码直接改Smali逻辑也可以绕过.检查密码正确后会启动一个新的Activity,密码作为extra参数传给这个Activity,在后面会用到,按下不表.
接下来考察打开的app这个Activity,其中又增加了新的模拟器检验
task中会结束进程
修改Smali绕过这处检验
move-result v0
if-eqz v0, :cond_c
.line 106
const/4 v0, 0x0
invoke-static {v0}, Ljava/lang/System;->exit(I)V
if-eqz改为if-nez,绕过此处.
接下来绕过add函数,这个函数是native,检查proc/procid/status中第五项,在android的环境中是tracer
通过检查该项值判断是否被调试,然而没有什么卵用直接Java层绕过…….话说这个函数伪装成add还传入两个参数,但是并没有用.
接下来pushbottom函数将bottom拷贝到/data/data/com.zctf.app/files/目录下,接下来app调用native函数sayHelloInc,将pass={Notthis}作为参数传入.Java静态部分完成,接下来IDA考察这个函数的功能.
上图是关键的一个分支,注意有一个DES解密函数跳转,这里R7储存的是malloc到堆上边的地址,指向解密后的内容,随后两个free,之后就too_late了,所以要在des执行后,free执行前获得r7指向的内存.需要进行动态调试.
首先考察这里的静态代码,又是熟悉的假add函数,在动态attach上去之后首先修改这里,否则会被发现调试退出,在mov r6,r0下断点强行改变r0=0,接下来执行到free之前,看r7地址,G到内存
看到了熟悉的PNG头,从这里开始向下把内存内容dump出来.
(这里插两句,ida的android_server只支持arm所以一开始静态分析最好直接从arm开始,该应用lib中包含了x86我没忍住就看了,后来耽误很多时间重新看arm.另外,程序不用的so IDA是检查不到module的,在attach时候加一个”载入新库停下来”然后在其中下断点.)
将复制的内容另存为png图像,使用stegSolve打开图片查图层得到frog(啥?)
就酱.
http://pan.baidu.com/s/1dEEnQk5 6bjm
- ZCTF Android1-200题解
- Android1
- ZCTF - 2016 - Reverse100
- 【ZCTF】easy reverse 详解
- 2017zctf misc300
- zctf-pwn500-restaurant-write-up
- [zctf 2016] reverse 100 write up
- Android1.5中的AVD
- 关于Android1.5 porting
- android1.5所有ContentProvider
- android1.5所有ContentProvider
- Android1.1 Activity02Acitvity回传值
- Android1.1 Activity03Acitvity生命周期
- Android1--Activity之间数据传输
- Linux安装 Android1.6
- Android1.6中文输入法调用
- Android1.5中的AVD 总结
- android1.5模拟器无线上网
- UNITY之SendMassage,Corouting
- 动态规划之矩阵链乘法理解
- 用java编写一个函数,统计一个字符串中每个字母出现的次数
- 构建ceph deb 安装包
- 微信支付笔记
- ZCTF Android1-200题解
- 2016.08.16【初中部 NOIP提高组 】模拟赛C
- HDU 5855 Less Time, More profit(最大权闭合图)
- JPA 配置persistence.xml
- 数据测试手札--------------------(1)
- DIV遮罩层的显示隐藏
- spring log4j配置
- 串口通信问题处理
- 设计模式-命令模式