[ACTF新生赛2020]usualCrypt

[ACTF新生赛2020]usualCrypt
在这里插入图片描述
在这里插入图片描述
有两个文件,其中.开头的是mac平台的程序,这里我们只要分析windows平台的就好

熟悉的查壳加ida分析
在这里插入图片描述
没有壳就直接拖进IDA吧,看见了main函数,f5反编译
在这里插入图片描述
分析一下main函数
关键点在于sub_401080函数,双击该函数粗略一看是一个常规的base编码算法,但其实有些改动在这里插入图片描述
sub_401000()将byte_40E0AA数组和byte_40E0A0数组的第6到15位元素作替换,双击任意一个数组可以发现其实byte_40E0AA是byte_40E0A0数组中从第11位元素开始截取的一部分
在这里插入图片描述
在这里插入图片描述
返回值是sub_401030函数,双击查看该函数
在这里插入图片描述
可以分析出这是一个字母大小写转换的算法
在这里插入图片描述
再回到main函数,接下来是判断v5是否和byte_40E0E4相等,若不相等则报错,相等则继续向下执行
在这里插入图片描述
有了上边的分析基础,接下来就可以根据byte_40E0E4这个切入点逆推出flag。
双击byte_40E0E4可以看到byte的元素(需要注意的是7Ah也是这个数组的一部分,选中这一部分元素按a将其转换为一个整体)
在这里插入图片描述
转换后如下在这里插入图片描述

接着根据上边的分析步骤,我们可以知道加密过程是

  1. 改变编码表
  2. 根据改变后的编码表对原数据进行类base64编码
  3. 对得到的数据大小写转换

我们可以反向推导写出解密脚本:

#导入base64模块用于将base64编码的数据转换为原始值
import base64

#key即是上边的byte_40E0E4
key = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
#对key进行大小写转换,这样就得到了编码后的值
key = key.swapcase()
#table是按base64编码表排列的字符串
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
dict = {}
flag = ''

#初始化一个键和值相等且根据按照table排列顺序的字典
for i in range(len(table)):
    dict[table[i]] = table[i]

#根据sub_401000函数的算法,构建一个原始与修改过的base64编码表的映射
for i in range(6,15):
    dict[table[i]], dict[table[i + 10]] = dict[table[i + 10]], dict[table[i]]

#将key映射后的值传给flag
for i in range(len(key)):
    flag += dict[key[i]]
    
#利用base64模块中的b64decode方法将flag(base64编码)转换为对应的原数据
flag = base64.b64decode(flag.encode()).decode()

#打印flag
print(flag)

在这里插入图片描述
得到flag{bAse64_h2s_a_Surprise}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chneft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值