欢迎关注 『网络攻防CTF』 系列,持续更新中
欢迎关注 『网络攻防CTF』 系列,持续更新中
实现效果
欢迎使用mzh制作的多次循环base64解码工具
按1继续base64解码
按2结束,退出程序
按3根据设定好的预期答案标志,自动循环执行解码
CTF密码学需求
求flag
Vm1wSmQyVkZOVWhTYTJScFRUTkNjbFZ0ZUdGV1ZsWnpWMjFHYVZac1dqQmFSVkpUVlcxS1JtSkVVbFZOVm5CRVZsUktTMUpYU2tkWGJGcE9VbXh3TmxadGRHRmliVlpIVlc1T1YySkdjRzlVVnpWdlZWWmFXR05GTld0TlZUUjZXVzV2ZDFOM2J6MEsK
对于上面的题目,看这个密文结构:
关于这个编码的规则:
①.把3个字节变成4个字节。
②每76个字符加一个换行符。
③.最后的结束符也要处理。
直接就想到了base64
,但是我们发现它的结尾不是==
,我们解密就是多试试,多次解密发现他每一次都会变短,那么就很有可能是多次进行了base64加密
1 次base64解码
VmpJd2VFNUhSa2RpTTNCclVteGFWVlZzV21GaVZsWjBaRVJTVW1KRmJEUlVNVnBEVlRKS1JXSkdXbFpOUmxwNlZtdGFibVZHVW5OV2JGcG9UVzVvVVZaWGNFNWtNVTR6WW5vd1N3bz0K
2 次base64解码
VjIweE5HRkdiM3BrUmxaVVVsWmFiVlZ0ZERSUmJFbDRUMVpDVTJKRWJGWlZNRlp6VmtabmVGUnNWbFpoTW5oUVZXcE5kMU4zYnowSwo=
3 次base64解码
V20xNGFGb3pkRlZUUlZabVVtdDRRbEl4T1ZCU2JEbFZVMFZzVkZneFRsVlZhMnhQVWpNd1N3bz0K
4 次base64解码
Wm14aFozdFVTRVZmUmt4QlIxOVBSbDlVU0VsVFgxTlVVa2xPUjMwSwo=
5 次base64解码
ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30K
6 次base64解码
flag{THE_FLAG_OF_THIS_STRING}
实现思路
- 传入的是字符串格式的密文,所以要进行编码转化为
btye格式
decode_str = base64.decodebytes(bytes(s, encoding='utf8') )
- 然后对
btye格式
解码
result=decode_str.decode()
print(result)
- 当auto_flag==0表示手动模式,如果输入命令3,则将当auto_flag=1,进行自动循环解码模式
auto_flag=1#进行自动循环解码模式
- flag_list设定可能出现的预期答案标志,如果result中包含这些列表中的标志,break循环
flag_list=["flag","ctf"]
实现代码
需要安装base64
库
# @Time : 2022/3/7 15:20
# @Author : 南黎mzh
# @FileName: 多次循环base64解码按1继续按2结束按3智能解码.py
import base64
print('''####################
欢迎使用mzh制作的多次循环base64解码工具
按1继续base64解码
按2结束,退出程序
按3根据设定好的预期答案标志,自动循环执行解码
####################\n
''')
def base64_auto(s,flag_list):
auto_flag=0 #当auto_flag==0表示手动模式,如果输入命令3,则将当auto_flag=1,进行自动循环解码模式
for i in range(1,99999):
if auto_flag==0:
num=eval(input("请输入命令:"))
if num==1:
print(i, "次base64解码")
elif num==2:
break
elif num==3:
print(i, "次base64解码")
auto_flag=1#进行自动循环解码模式
else:
print("请正确输入命令")
elif auto_flag==1:
print(i, "次base64解码")
decode_str = base64.decodebytes(bytes(s, encoding='utf8') )
result=decode_str.decode()
print(result)
s=result#把result赋值给s,用于下一次的解码
#如果出现了flag答案标志,结束
for j in flag_list:
if j in result:
print("出现了flag答案标志{},结束".format(j))
return
#s是初始待解码的字符串
s = 'Vm1wSmQyVkZOVWhTYTJScFRUTkNjbFZ0ZUdGV1ZsWnpWMjFHYVZac1dqQmFSVkpUVlcxS1JtSkVVbFZOVm5CRVZsUktTMUpYU2tkWGJGcE9VbXh3TmxadGRHRmliVlpIVlc1T1YySkdjRzlVVnpWdlZWWmFXR05GTld0TlZUUjZXVzV2ZDFOM2J6MEsK' # string
#flag_list设定可能出现的预期答案标志,如果result中包含这些列表中的标志,break循环
flag_list=["flag","ctf"]
base64_auto(s,flag_list)
总结
大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!
版权声明:
发现你走远了@mzh原创作品,转载必须标注原文链接
Copyright 2022 mzh
Crated:2022-3-6
欢迎关注 『网络攻防CTF』 系列,持续更新中
欢迎关注 『网络攻防CTF』 系列,持续更新中
python写的base64循环解码小工具(保姆级图文)
【更多内容敬请期待】