zoukankan      html  css  js  c++  java
  • 日常破解--XCTF easy_apk

    一、题目来源

        来源:XCTF社区安卓题目easy_apk


    二、破解思路

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

    2.PNG

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

    4.PNG

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

    6.PNG
    3.PNG

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

    2.PNG
    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[0] << 2
    c = str_list[1] & 15
    b = str_list[1] >> 4
    a = a | b
    list_base.append(a)
    c = c << 4
    a = str_list[2] & 3
    b = str_list[2] >> 2
    c = c | b
    list_base.append(c)
    a = a << 6
    a = a | str_list[3]
    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[i + k] == '=':
    		list1.append(0)
    		n = n + 1
    	else:
    		list1.append(CodingTable.index(Ciphertext[i + k]))
    ba = Base64Decode(list1)
    for j in range(3 - n):
    	ch = chr(ba[j])
    	flag = flag + str(ch)
    i = i + 4
    
    flag = flag + '}'
    print(flag)
  • 相关阅读:
    赠与今年的大学毕业生(胡适先生30年代的文章,仍不过时)
    统一管理磁盘上的开源代码
    生成sqlite导入库的做法
    提高二维矢量绘图效率之一般做法
    boost库命名规则的优点
    如何把腾讯微博挂到CSDN博客上
    fatal error C1902 Program database manager mismatch; please check your installation问题的解决
    智能指针变量做函数参数的一个值得注意的地方
    PC会消亡吗?
    软件制造问题的微软答案
  • 原文地址:https://www.cnblogs.com/aWxvdmVseXc0/p/11955006.html
Copyright © 2011-2022 走看看