VCTF题解

ezre

这是一道混合加密base64的改表和rc4的魔改

加密原理

RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。

RC4算法中的几个关键变量:
1:S-Box 也就是所谓的S盒,是一个256长度的char型数组,每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换。

2:密钥K char key[256] 密钥的长度keylen与明文长度、密钥流的长度没有必然关系

3:临时向量k 长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给k,否则,轮转地将密钥的每个字节赋给k
                        
原文链接:https://blog.csdn.net/xiao__1bai/article/details/123357156

1.先拖入exe查看,直接拖入ida64

从这里直接观察到有一串字符有base64的特征(关于base64,我的上一篇博客有写)

 是一串base64加密直接到赛博厨子解密得不到什么,先保留下来,然后继续观察

 3pn1Ek92hmAEg38EXMn99J9YBf8=

然后F5进入伪代码逐一点进去分析函数

这里直接看到就是一个rc4的128位,分析应该上面的Thi5_1S_key?就是密钥

但是没有加密之前的data,然后继续往后看

 这里就是一个base64改表,点进下面那个a0123456789xyza就能得到改过的表

 得到改过的表然后可以网上找一个脚本得到数据0123456789XYZabcdefghijklABCDEFGHIJKLMNOPQRSTUVWmnopqrstuvwxyz+/

import base64

str1 = "3pn1Ek92hmAEg38EXMn99J9YBf8="
 #str1是要解密的代码
string1 = "0123456789XYZabcdefghijklABCDEFGHIJKLMNOPQRSTUVWmnopqrstuvwxyz+/"
 #string1是改过之后的base64表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
#b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"'

b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"'

 得到没经过rc4解密的数据然后又知道密钥,写出脚本得到flag


def key(box, key):
    for i in range(128):   #初始化T表
        box[i] = i
    j = 0
    for i in range(128):          #将s盒打乱
        j = (j + box[i] + key[i % len(key)]) & 127  
        box[i], box[j] = box[j], box[i]

def encrypt(box, input):
    output = []
    k = 0
    for i in range(len(input)):       #得到密钥流加密
        j = (i + 1) & 127
        k = (box[j] + k) & 127
        box[k], box[j] = box[j], box[k]
        output.append(box[(box[j] + box[k]) & 127] ^ input[i])
    return bytes(output)

box = [0] * 128
key(box, b'Thi5_1S_key?')
print(encrypt(box,(b'\x0f<AurBS\x06]L2\x1d*\\I&"Ki"')))
# flag{Simple_rEvErse}

flag{Simple_rEvErse} 

 还有一个方法是动态调试,但是我f8单步进入的时候有问题

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值