攻防世界题解4-easy-apk
# easy-apk> 附件地址:https://adworld.xctf.org.cn/media/task/attachments/5eba4595b15a4afb8567c037ff5a6a88.apk
这个题目还是比较简单的,感觉是做的前四道里面最简单的。也侧面说明确实这个顺序和难度关系不太对。
解压后可以发现不存在lib文件夹,也就是说我们只分析java代码即可。
首先,老规矩,看一下我们的MainActivity。
可以发现,很简单的逻辑。
![](http://img.5am3.com/5am3/img/20200112144702.png)
将我们输入的字符串,加密后与已知字符串做比较。
此时,可以大胆猜测`5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=`是段base64。(毕竟代码中写的很清楚。)
尝试解密,发现失败。
![](http://img.5am3.com/5am3/img/20200112144833.png)
然后进而去分析他这个base64New.
![](http://img.5am3.com/5am3/img/20200112144908.png)
可以发现,他对base64码表进行了修改。
此时我们拿出第一关中的用的那个base变种脚本,替换我们的码表即可。
最终get flag
```python
"""
base64实现
"""
import base64
import string
# base 字符集
# base64_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'
base64_charset = "vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/"
def encode(origin_bytes):
"""
将bytes类型编码为base64
:param origin_bytes:需要编码的bytes
:return:base64字符串
"""
# 将每一位bytes转换为二进制字符串
base64_bytes = ['{:0>8}'.format(str(bin(b)).replace('0b', '')) for b in origin_bytes]
resp = ''
nums = len(base64_bytes) // 3
remain = len(base64_bytes) % 3
integral_part = base64_bytes
while integral_part:
# 取三个字节,以每6比特,转换为4个整数
tmp_unit = ''.join(integral_part)
tmp_unit = , 2) for x in ]
# 取对应base64字符
resp += ''.join( for i in tmp_unit])
integral_part = integral_part
if remain:
# 补齐三个字节,每个字节补充 0000 0000
remain_part = ''.join(base64_bytes) + (3 - remain) * '0' * 8
# 取三个字节,以每6比特,转换为4个整数
# 剩余1字节可构造2个base64字符,补充==;剩余2字节可构造3个base64字符,补充=
tmp_unit = , 2) for x in ][:remain + 1]
resp += ''.join( for i in tmp_unit]) + (3 - remain) * '='
return resp
def decode(base64_str):
"""
解码base64字符串
:param base64_str:base64字符串
:return:解码后的bytearray;若入参不是合法base64字符串,返回空bytearray
"""
if not valid_base64_str(base64_str):
return bytearray()
# 对每一个base64字符取下标索引,并转换为6为二进制字符串
base64_bytes = ['{:0>6}'.format(str(bin(base64_charset.index(s))).replace('0b', '')) for s in base64_str if
s != '=']
resp = bytearray()
nums = len(base64_bytes) // 4
remain = len(base64_bytes) % 4
integral_part = base64_bytes
while integral_part:
# 取4个6位base64字符,作为3个字节
tmp_unit = ''.join(integral_part)
tmp_unit = , 2) for x in ]
for i in tmp_unit:
resp.append(i)
integral_part = integral_part
if remain:
remain_part = ''.join(base64_bytes)
tmp_unit = , 2) for i in range(remain - 1)]
for i in tmp_unit:
resp.append(i)
return resp
def valid_base64_str(b_str):
"""
验证是否为合法base64字符串
:param b_str: 待验证的base64字符串
:return:是否合法
"""
if len(b_str) % 4:
return False
for m in b_str:
if m != "=" and m not in base64_charset:
return False
return True
if __name__ == '__main__':
local_base64 = "5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="
print('使用本地base64解密:', decode(local_base64).decode())
``` 没人顶???我顶了! 看起来很不错的样子,谢谢分享 {:1_925:}我膨胀了,完全不懂。 这个挺不错。可以试下 {:1_893:}发点动态注册so函数的吧{:1_893:} http://139.199.107.193:2210/asd ding yi ding
页:
[1]