180502 逆向-wcm(2)

xiaoxiao2021-02-28  43

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

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

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

首先通过两个while循环遍历找到value和key的下标

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

0123…26abc…zaabc…zbbcd…accde…b………………zzab…y

对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)
转载请注明原文地址: https://www.6miu.com/read-2627296.html

最新回复(0)