放着一个猜出的flag不是我的风格,于是又仔细看了一下~
首先将输入encode成hex以后送入了这个函数中
对于非字母,也就是数字部分直接查一个表即可
逆的时候也就是相应的反查这个表的index了,很简单,没啥好说的
同时因为flag的hex大部分是0x6?,因此这个判断机制实际上大部分都落在数字部分里了,这也最终让我昨天猜了过去233
对于字母就有些复杂了,会通过函数sub_4010E0来处理
事实上就是一个维吉尼亚解密,跟进去看的流程虽然比较乱,但是理顺了还是很清晰的
函数中先通过-‘A’和-‘a’来判断大小写,由于它encode出来的都是小写字母,因此这里以小写字母为例。大写字母中除了Table不一样,其他完全一致
首先通过两个while循环遍历找到value和key的下标
这个table_lowwer如下
敏感的话一眼就能看出来是维吉尼亚表的二维数组,一维宽度为27,如下
0 | 1 | 2 | 3 | … | 26 |
---|---|---|---|---|---|
a | b | c | … | z | |
a | a | b | c | … | z |
b | b | c | d | … | a |
c | c | d | e | … | b |
… | … | … | … | … | … |
z | z | a | b | … | 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)