CTFShow中BJDCTF2020的RE题

encode

写脚本时候发现了应该就是一个 base64 和 RC4 结合
在这里插入图片描述
base64
在这里插入图片描述
rc4的初始化S盒
在这里插入图片描述
rc4的异或加密
在这里插入图片描述
好久没有做题,有点忘记了,直接动调
可以把初始 S盒调出来,后面解总是出乱码,也是看了好久的wp才知道v6后面要赋值的字符串是十六进制bytes组成的
而IDA扫出来的这个字符串有点问题,它是加密后的hex,但是像01这种的它直接变成了1,所以bytes.fromhex的时候会出错,位数都对不上
在这里插入图片描述
这个之后也要问问
然后贴一个大佬的脚本吧,感觉脚本都学了很多

key0 = b'Flag{This_a_Flag}'   #密钥
c = bytes.fromhex('E8D8BD91871A010E560F53F4889682F961420AF2AB08FED7ACFD5E00')   #加密后的字符串
v9 = [i for i in range(256)]
v8 = (key0 * 50)[:256]
j = 0
for i in range(256):
    j = (v9[i] + j + v8[i]) % 256
    v9[i], v9[j] = v9[j], v9[i]
tab = [0] * 28
i, j = 0, 0
for t in range(28):
    i = (i + 1) % 256
    j = (v9[i] + j) % 256
    v9[i], v9[j] = v9[j], v9[i]
    tab[t] = v9[(v9[i] + v9[j]) % 256]
 
c = [tab[i] ^ v for i, v in enumerate(c)]
print(c)
v5 = "Flag{This_a_Flag}"
str_values = [35, 21, 37, 83, 8, 26, 89, 56, 18, 106, 57, 49, 39, 91, 11, 19, 19, 8, 92, 51, 11, 53, 97, 1, 81, 31, 16, 92]
result = []

for i in range(len(str_values)):
    result.append(chr(str_values[i] ^ ord(v5[i % len(v5)])))

print(''.join(result))

再 base 解密就可以了

问题:这个 v6 是如何看出是十六进制字节组成的,又如何还原成正常 1–>01,不去0的形式

想自己来提取数据,还是有一点问题

data=[0x38443845,0x31394442,0x41313738,0x36354531,0x46333546,0x39383834]
array=[]
for i in range(0,len(data),1):
    array.append((data[i]&0xff))
    array.append((data[i]>>8)&0xff)
    array.append((data[i]>>16)&0xff)
    array.append((data[i] >> 24) & 0xff)
print(len(array))
for i in range(24):
    print(chr(array[i]),end='')
#E8D8BD91871A1E56F53F4889

“D:\ctf附件2\BJD_hamburger_competition\BJD_hamburger_competition\BJD hamburger competition_Data\Managed\Assembly-CSharp.dll”
丢 dnspy
在这里插入图片描述
找到主要位置
应该是先 Sha1 再 Md5 加密了,解密反过来
之前做过还有点印象,还是要细心一点
在这里插入图片描述

JustRe

在这里插入图片描述
在这里插入图片描述
额,就这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值