[ACTF新生赛2020] usualCrypt

在这里插入图片描述
运行
在这里插入图片描述

1.查壳

在这里插入图片描述
32位exe程序,没有壳。

2.用32位IDA打开

找到main函数,扫一眼汇编代码看不出来什么信息,F5查看伪代码
在这里插入图片描述
可以根据

 while ( *((_BYTE *)v5 + v3) == byte_40E0E4[v3] )
  {
    if ( ++v3 > strlen((const char *)v5) )
      goto LABEL_6;
  }

推测出v5byte_40E0E4相同。
双击byte_40E0E4看里面的内容
在这里插入图片描述
是一段字符串,这里要记得7A也是字符串的内容,对应ASCII码的z
拿到v5之后,接着往上看,出现一个函数sub_401080,可以推断出是对我们输入的v8进行了加密,得到了v5
查看函数内容
在这里插入图片描述
看了下应该是base64加密,对密文解密得到的却是乱码。这其中一定还有其他操作。
发现这个函数里面又出现了两个函数sub_401000()sub_401030(a3)
分别分析其作用

这个函数是把我们要用到的base64加密表给换了。
在这里插入图片描述

这个函数的参数a1是加密后的字符串v5。
它的作用是把大写转换为小写,小写转换为大写,数字不变。
在这里插入图片描述
加密流程就是 明文->更换base64加密表->用换了的表对明文进行加密->大小写转换->密文。
开始写脚本

import base64
v5='zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
v5=list(v5)
for i in range(0,len(v5)):
    if ord(v5[i])>=ord('A') and ord(v5[i])<=ord('Z'):
        v5[i]=chr(ord(v5[i])+32)
    elif ord(v5[i])>=ord('a') and ord(v5[i])<=ord('z'):
        v5[i]=chr(ord(v5[i])-32)
key=('')
for i in range(0,len(v5)):
    key+=v5[i]
print(key)

String1='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
String2=String1
String1=list(String1)
for i in range(6,15):
    v1=String1[10+i]
    String1[10 + i]=String1[i]
    String1[i]=v1
b654String=''
for i in range(0,len(String1)):
    b654String+=String1[i]
print(b654String)
print(base64.b64decode(key.translate(str.maketrans(b654String,String2))))
>>>flag{bAse64_h2s_a_Surprise}

flag{bAse64_h2s_a_Surprise}

补充

对于base64编码表的转换,我们还可以使用一个在线自定义base编码
在这里插入图片描述

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值