zoukankan      html  css  js  c++  java
  • [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)
    

    在这里插入图片描述

  • 相关阅读:
    睡前一分钟打造完美下半身 健康程序员,至尚生活!
    几种不伤身体的速效减肥秘方 健康程序员,至尚生活!
    头发一周洗几次才适宜? 健康程序员,至尚生活!
    夏日驱蚊虫蟑螂的最好办法! 健康程序员,至尚生活!
    WPF控件和布局
    《深入浅出WPF》笔记——绑定篇(二)
    WPF中的DataTemplate绑定使用的场合
    WPF第一个程序和XAML初探
    实习总结之jquery实例
    下一步要实战的东西
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273639.html
Copyright © 2011-2022 走看看