安卓逆向之华山杯ctf第四题:神奇的zip

题目下载:http://download.csdn.net/detail/darmao/9873200
拿到这个题,apk无法安装,拖到jeb里也无法反编译,试了一下zip伪加密,将504B0102后边的第五第六个字节都改成偶数,两处需要修改:

这里写图片描述
这里写图片描述
然后安装就能打开了。

**首先打开有个闪屏:提示未获取权限 5秒之后就退出了
这里有三种解决方法:
第一种:最简单的方法**
这里写图片描述
**manifest文件中注册了两个activity,打开的闪屏的是主activity,我们的目的是打开MainActivity,所有直接打开adb shell,获得shell,提升到root权限,执行:
am start -n com.example.testndk4/com.example.testndk4.MainActivity 直接就来到了输入密码的界面。**
这里写图片描述

*第二种:*修改smali
我们来看看闪屏activity的逻辑:**
这里写图片描述
**调用了isExit方法,如果返回值为true就打开mainActivity,否则准备关闭
看看对应的smali:**
这里写图片描述
**将这里的if-eqz 改成if-nez即可
第三种:我们去看看native层的isExit方法:**
这里写图片描述
**这里返回值恒为0,所以只需要将对应处改成1,然后重新打包即可。
经过以上步骤,终于来到了mainActivity,直接需要输入一个密码:**
这里写图片描述
我们去看看这里的代码逻辑:
这里写图片描述

逻辑很简单,将输入的密码传递到native层的encodePassword进行了处理,我们去动态调试一下吧

打开ida,断点下在这个函数的处:
这里写图片描述
这里写图片描述
**v2是从java层拿到的密码,v4是正确的密码,这两个进行比较
单步到v4=(encodePS)(&10)处**
这里写图片描述
**这里调用encodePS函数,返回值就是正确的password,
执行完看返回值,在R0寄存器:**
这里写图片描述
这里就是正确密码啦

**password:lxienietIeAehfyih