180502 逆向-wcm(2)

放着一个猜出的flag不是我的风格,于是又仔细看了一下~

首先将输入encode成hex以后送入了这个函数中
这里写图片描述
对于非字母,也就是数字部分直接查一个表即可
逆的时候也就是相应的反查这个表的index了,很简单,没啥好说的
同时因为flag的hex大部分是0x6?,因此这个判断机制实际上大部分都落在数字部分里了,这也最终让我昨天猜了过去233

对于字母就有些复杂了,会通过函数sub_4010E0来处理
事实上就是一个维吉尼亚解密,跟进去看的流程虽然比较乱,但是理顺了还是很清晰的
函数中先通过-‘A’和-‘a’来判断大小写,由于它encode出来的都是小写字母,因此这里以小写字母为例。大写字母中除了Table不一样,其他完全一致

首先通过两个while循环遍历找到value和key的下标
这里写图片描述

这个table_lowwer如下
这里写图片描述
敏感的话一眼就能看出来是维吉尼亚表的二维数组,一维宽度为27,如下

012326
abcz
aabcz
bbcda
ccdeb
zzaby

对j的循环中,由于每次v5+25,因此永远取的是table[x][0]的值,也就是找到的第x列
对i的循环中,由于仅在第一列取,因此拿到的就是value的下标

取值方法在函数最后
这里写图片描述
显然就是以key作为行,value作为列来取值了

显然就是个维吉尼亚╮(╯_╰)╭
注意偏移i是字母的下标,而不是整个数列的下标,这里想当然被坑了好久233333

解密当然很简单,因为我们key是已知的,用密文与key值作差即可得到明文的偏移
脚本如下:

rand_letter = "sxcunsbjptdunaaxklcvxsikxiewcmpwdngfqtfvomgkbwjrmccntqlratukzoafmngbyykjtabnhrnmweln"

flag = ""
k = 7
n = 0
for i in range(len(r)):
    p = (r[i])
    if(p in tt):
        p = str(int(tt.index(p)))
    else:
        key = (rand_letter[n%len(rand_letter)])
        n += 1
        p = chr(ord(p)-ord(key)+ord('a'))
    flag += p
print(flag)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值