[BUUCTF]REVERSE——[ACTF新生赛2020]usualCrypt
阅读原文时间:2022年04月27日阅读:1

[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)

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章