-
-
[原创]安卓逆向之2016年华山杯CTF安卓writeUp
-
发表于:
2017-6-17 18:29
9203
-
[原创]安卓逆向之2016年华山杯CTF安卓writeUp
题目下载:http://download.csdn.net/detail/darmao/9873200
题目打开是这样的,有个序列号,然后根据这个序列号生成一个注册码,然后输入即可解锁。
首先我们,这个序列号是不停更新的,所以我们需要先反编译,将其变化的周期改长一些:
点击提交按钮的代码逻辑是这样的:
调用了encryption01.MyEncryption()函数,用输入的注册码和这个函数的返回值相比较,一般的思路就是开始看着搞函数的加密算法,但是我们看看smali代码:
这里将encryption01.MyEncryption()的返回值放到了v1寄存器里,这个时候可以添加一个toast,将注册码弹出来:
重新打包,触发onClick函数,这时就会将正确的注册码弹出来了。
******************************************************************************************
第二题:
题目下载:http://download.csdn.net/detail/darmao/9873200
安装后打开是这样的:
输入用户名和密码登陆
扔进jeb里看看:
加壳了,看看是如何动态加载的:
**依次调用了readDexFileFromApk()–>splitPayLoadFromDex()
第一个函数先将apk解压,将里边的dex文件读入到一个byte[]里,重点在splitPayLoadFromDex()函数:**
通过以上分析,我们可以得到加壳了以后的apk的结构应该是:
+——-+———–|——————+
+ 壳子 | 原始apk | 原始apk的长度 |
+ ——+———–+——————+
我们需要做的就是将原始apk读取出来,然后解密,看看解密算法:
**直接和0xff或一下即可
Java代码如下:**
**将这个读取出来的新apk拖到jeb里:
onClick函数:**
这里调用了checkNameAndPassword这个函数,其中第一个参数是:用户名,第二个是密码,还有另外一个参数,我们看看这个函数:
**首先对用户名做了使用sha-1进行了哈希,然后读取前16个字节
进行判断的部分:密码要等于这前十六个字节,同时用户名等于其传进去的第三个参数,第三个参数是什么呢?**
U2hlMTFfTjZSYw== 这个字符串的解码
总结:用户名:base64.decode(“U2hlMTFfTjZSYw==”);
密码:sha1(“用户名”).subString(0,16);
用户名:She11_N6Rc
密码:6acbbca78fdca0c5
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)