知识点
java.security.MessageDigest类
功能:用于为应用程序提供信息摘要算法的功能,如md5和SHA。换句话说,就是生成md5或者是SHA密码。
相关:
getinstance:静态函数,用来实例操作和初始操作。
update:处理数据
reset:重置摘要
digest:明文变为密文
解题流程
根据题目下载了一个压缩包
首先下载文件,看到是apk文件,那就是安卓逆向。拿模拟器来运行看看
jeb打开文件,找到关键函数
分析代码,计算v1的md5,形成的md5密文的字符串取偶数就是flag
在onCreate里面调用了checkSN函数,传进去的值是edit_username和edit_sn,edit_username就是v1
用python写md5的算法,求解flag
import hashlib
import string
def encrypt_md5(str):md=hashlib.md5() #创建md5对象md.update(str.encode(encoding='utf-8')) #这里需用encode()函数对字符串进行编码,#不然会报TypeError: Unicode-objects must be encoded before hashingreturn md.hexdigest()s="Tenshine"
s=encrypt_md5(s)
print(s)
print(len(s))#方法一:
for i in range(len(s)):if i%2==0:print(s[i],end='')
#方法二:
for i in range(0,len(s),2):print(s[i],end='')
总结下来:首先用户名是固定的,Tenshine经过MD5加密之后就是
b9c77224ff234f27ac6badf83b855c76这一串,根据源码分析,每隔1位进行拼接就是flag,所以就是flag{bc72f242a6af3857}
方法二:
某大佬有另外的解法,我直接拷过来了,不过我没有成功实现此方法,有兴趣的可以了解一下。
首先我们通过Android killer反编译这个apk找到checkSN函数
这里呢可以看到当调用此函数的时候会传递两个string类型的参数,这里我们转Java代码看一下
这里呢可以看到当调用此函数的时候会传递两个string类型的参数,这里我们转Java代码看一下
这里呢 前面那几个判断 我们直接无视,下面这一块我圈起来的代码 我们可以看到 他是判断 参数2的长度有没有22个 有的话 则开始算flang的然后跟参数2进行比较,注意看 这里是突破点
通过这几串代码 我们可以看到他是判断参数2长度有没有22个 有的话就算出flag的值 跟参数2进行比较
这里我们返回Android killer 找到文本比较这个位置的代码 然后直接输出log 打印出代码算出的flag的内容
然后编译回去 再在模拟器里面安装 然后打开ddms 这里我们在输入框里面随便输入22位内容 然后点击按钮
再看ddms可以看到flag已经输出出来了
这样就找出flag的值了