攻防世界 easyjava 解题思路

博客详细分析了攻防世界EasyJava挑战的解题思路,主要涉及字符串加密与解密的逻辑。通过jadx工具分析APK,发现加密过程涉及两个关键类a和b,分别实现特定的字符索引映射。作者使用Python复现了加密和解密函数,并提供了解密脚本,最终得出解密后的字符串为'flag{venividivkcr}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

攻防世界 easyjava 解题思路

一、jadx分析

通过jadx打开apk文件,查看其MainActivity可以发现大概逻辑为,传入的flag为flag{XXXXXXX}的样式,然后flag{}包裹的字符串经过逐字符加密后需要等于wigwrkaugala,加密函数主要由两个类来控制,a类和b类,于是分析这两个类
请添加图片描述
分析类b的主要功能为获取传入字符串在this.b中的索引,根据它的值再获取其在this.a中的索引返回,结束后this.a和this.b的第一位移动到最后一位
请添加图片描述
分析类a可以发现,其逻辑跟类b差不多,其主要功能是根据传入的值,寻找其在this.a中的索引,根据其获得的值,取到this.b中对应位置的字符。值得注意的是,类a中的this.a和this.b不会变动,只要字符串长度不超过25。
请添加图片描述

二、整体逻辑分析

根据三个类,可以分析出其最终加密逻辑为:

初始化b.a和a.a->传入字符->获取字符在b.b中对应索引->获取得到的值在b.a中对应索引(同时b.a和b.b的第一位移动到最后一位)->获取得到的值在a.a中对应的索引->获取以得到的值为索引对应在a.b中的值。

用python复现加密函数代码如下:

a_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  #  a.b
a = [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]  # a.a
b_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  # b.b
b = [17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25]  # b.a

def encode(input):
    result = a_str[a.index(b.index(b_str.index(input)))]
    b.append(b.pop(0))
    b_str.append(b_str.pop(0))
    return result

所以根据其逻辑可以反推出解密逻辑为:

初始化b.a和a.a->传入字符->获取字符在a.b中对应索引->获取以得到的值为索引对应在a.b中的值->获取以得到的值为索引对应在b.a中的值->获取以得到的值为索引对应在b.b中的值(同时b.a和b.b的第一位移动到最后一位)。

用python复现解密函数代码如下:

a_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  #  a.b
a = [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]  # a.a
b_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  # b.b
b = [17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25]  # b.a

def decode(input):
    result = b_str[b[a[a_str.index(input)]]]
    b.append(b.pop(0))
    b_str.append(b_str.pop(0))
    return result

三、编写解密脚本

最终完整的解密脚本如下(把循环中的decode换成encode则为加密脚本)

a_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  #  a.b
a = [21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8, 7, 14, 16]  # a.a
b_str = [i for i in "abcdefghijklmnopqrstuvwxyz"]  # b.b
b = [17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13, 8, 25]  # b.a

def decode(input):
    result = b_str[b[a[a_str.index(input)]]]
    b.append(b.pop(0))
    b_str.append(b_str.pop(0))
    return result

def encode(input):
    result = a_str[a.index(b.index(b_str.index(input)))]
    b.append(b.pop(0))
    b_str.append(b_str.pop(0))
    return result

encode_str = "wigwrkaugala"
decode_str = ""
for i in encode_str:
    decode_str += decode(i)
print(decode_str)

得到解密的字符串为:venividivkcr

最终flag为:flag{venividivkcr}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值