[BUUCTF]REVERSE——[ACTF新生赛2020]usualCrypt

[ACTF新生赛2020]usualCrypt

附件

步骤:

  1. 例行检查,无壳,32位程序
    在这里插入图片描述

  2. 32位ida载入,直接看main函数
    在这里插入图片描述
    逻辑很简单,一开始让我们输入一个字符串,然后该字符串经过sub_401080()函数加密,加密后得到byte_40E0E4里面的数据zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9

  3. 看一下sub_401080函数
    在这里插入图片描述在这里插入图片描述
    头部有一个sub_401000函数,中间看运算特征码可以判断是base64加密,尾部一个sub_401030函数

  4. 先从sub_401000函数函数开始看起
    在这里插入图片描述
    将两个数组里的数据进行了交换,看地址两个数组是连在一起的,其实也可以连在一起当成一个数组看,从下标为6开始到下标为15,往后偏移了10(0xA)位,也就是QRSTUVWXYGHIJKLMNOP相互交换了一下
    在这里插入图片描述
    所以原始用来加密的base64密码表是ABCDEFQRSTUVWXYGHIJKLMNOPZabcdefghijklmnopqrstuvwxyz0123456789+/

  5. 再看一下sub_401030函数,对字符串进行了大小写的转换
    在这里插入图片描述

  6. 程序理清楚了,我们可以反向推导,
    第一步首先要对进行byte_40E0E4数组进行大小写转换,也就是我们输入的数据进行了base64加密后的状态
    第二步是还原经 base64(更改密钥表后)加密字符的原含义,还原规则即sub_401000()的交换
    第三步最后得到了真实的nbase64n加密字符串,解密即可得到我们输入的字符串,一般都是flag

import base64

flag = ''
dict = {}
offset = 10

string = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'.swapcase() #sub_401030()
print ('转换后的字符串:'+string)

myb = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'


for i in range(len(myb)):
    dict[myb[i]] = myb[i]
    


for i in range(6, 15): #sub_401000()
    dict[myb[i]] , dict[myb[i+offset]] = dict[myb[i+offset]] , dict[myb[i]] # 恢复base64密钥表
  


print ('**********')
for i in dict:
    print (i,dict[i])
print ('**********')

for i in range(len(string)):
    flag += dict[myb[i]]
   
    
flag = base64.b64decode(flag)

print(flag)

在这里插入图片描述

原文地址:https://www.cnblogs.com/xlrp/p/14273639.html