windy_ll 发表于 2019-11-29 00:02

日常破解--XCTF easy_apk

本帖最后由 windy_ll 于 2022-3-29 21:48 编辑

##一、题目来源
**    来源:XCTF社区安卓题目easy_apk**

---

##二、破解思路

**    1、首先运行一下给的apk,发现就一个输入框和一个按钮,随便点击一下,发现弹出Toast`验证失败`。如下图所示:**

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/2.PNG)

**    2、将该APK直接拖进AndroidKiller中反编译,搜索关键字验证失败,如下图所示:**

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/4.PNG)

**    3、关键代码就在MainCtivity.java处,使用jeb直接查看Java代码(偷懒不看smali汇编了,看到脑壳痛),发现代码逻辑为将用户输入的字符串使用Base64New类中的Base64Encode()函数加密后和一个字符串相比较,若相等,则验证通过,否则验证失败,点击跳转到Base64New类中,发现Base64Encode()函数首先将用户输入得到的字符串转为字节数组作为参数,然后每3个字节为一组,扩展为4个字节,最后查表即可(感觉很眼熟的样子,emmmm就是base64编码,只是对照表跟base64对照表不同,可惜我在写完解密脚本之后才发现是这东西),那么解密过程也很简单了,直接对字符串4个字节一组分组,缩减为3个字节一组(语文水平感觉很差的样子写道这里。。。。),然后转为字符拼接成字符串即可。**

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/6.PNG)
![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/3.PNG)

**    4、将解码过程写出python脚本跑出flag,填入验证通过!!!**

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/5.PNG)
![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//xctf_easy_apk/1.PNG)

---

##三、总结

**    总结:很基础的一道题,唯一的难点就在必须写base64解码脚本了吧,emmmm要是像我一样木有认出来是base64,那一开始就有点难受了!!!下面附上Base64编码解码原理以及相关脚本!!!**
**    Base64编码原理:**
**    1、将字符串转为字节数组,然后每3个字节一组,一个24个比特,不足3个字节直接补0**
**    2、在每一组3个字节24bit中,以6个bit构成一个字节(高两位补0),形成4个字节为一组**
**    3、根据编码后的字节查找对照表,拼接成字符串,自此,Base64编码完成!!!**

**    Base64解码原理:**
**    1、将编码后的字符串查找对照表后的字节以4个字节为一组,出现`=`直接去掉即可**
**    2、将这4个字节每个字节的高两位去掉,有32bit变为24bit,将这24bit以8个bit构成三个字节**
**    3、将第二步得到的字节数组转为字符串即可!!!**

**    附上python脚本(ps:由于markdown问题,所以有需要的主机更改一下某些地方的缩进):**

        def Base64Decode(str_list):
        list_base = []
        a = str_list << 2
        c = str_list & 15
        b = str_list >> 4
        a = a | b
        list_base.append(a)
        c = c << 4
        a = str_list & 3
        b = str_list >> 2
        c = c | b
        list_base.append(c)
        a = a << 6
        a = a | str_list
        list_base.append(a)
        return list_base
       
        CodingTable = 'vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/'
        Ciphertext = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='

        i = 0
        flag = 'flag{'

        while i <= (len(Ciphertext) - 1):
        list1 = []
        n = 0
        for k in range(4):
                if Ciphertext == '=':
                        list1.append(0)
                        n = n + 1
                else:
                        list1.append(CodingTable.index(Ciphertext))
        ba = Base64Decode(list1)
        for j in range(3 - n):
                ch = chr(ba)
                flag = flag + str(ch)
        i = i + 4
       
        flag = flag + '}'
        print(flag)

windy_ll 发表于 2019-11-29 20:51

流光夜雪200 发表于 2019-11-29 19:47
您好,请问我为啥逆向反编译的时候报这个错误?D:\java1\lib\rt.jar: invalid LOC header (bad signature)

你的报错显示dex文件头部sha-1签名有问题

windy_ll 发表于 2019-11-29 15:47

zhangz7777777 发表于 2019-11-29 15:24
挺好的,谢谢啦。我想要源码看下拿来研究下

题目来源于xctf社区,需要的可以自己去xctf社区去下载

949561081 发表于 2019-11-29 00:23

windy_ll 发表于 2019-11-29 00:26

949561081 发表于 2019-11-29 00:23
这不是我上次做过的一道题。。。

emmm,最近在做xctf题库的题,重复很正常

1970zlx 发表于 2019-11-29 07:21

感谢分享!

神秘高手Mars偉 发表于 2019-11-29 08:16

aoyoudahai 发表于 2019-11-29 08:17

谢谢楼主分享

xznulc 发表于 2019-11-29 09:20


感谢分享!

TwilightZ 发表于 2019-11-29 09:34

大佬,请问你大腿还缺挂件不?

windy_ll 发表于 2019-11-29 11:35

TwilightZ 发表于 2019-11-29 09:34
大佬,请问你大腿还缺挂件不?

。。。。。。。。可惜我不是大佬

windy_ll 发表于 2019-11-29 11:36

神秘高手Mars偉 发表于 2019-11-29 08:16
楼主,从哪里开始学这个呢?

可以先从写安卓开始
页: [1] 2 3
查看完整版本: 日常破解--XCTF easy_apk