首先下载附件,可以看到内容是一串python代码
flag = 'xxxxxxxxxxxxxxxxxx'
list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
result = ''
for i in range(len(list)):
key = (list[i]>>4)+((list[i] & 0xf)<<4)
result += str(hex(ord(flag[i])^key))[2:].zfill(2)
print(result)
# result=bcfba4d0038d48bd4b00f82796d393dfec
分析一下代码多度干了什么
1.定义了一个list列表里面的内容是数字,看到这种范围的数字一般都是ascii码值
2.做了个循环,把表中的每一个数字,右移四位再加上补位后在左移四位
这波操作就有点让人摸不着头脑了
写个代码自己测试一下,是怎么个事儿!
简单看看怎么把242变回47
只需要简简单单的替换就可以了,甚至不需要逆运算
用计算器看一下基本原理是什么
第一个数,47的二进制是00101111,>>4就是向右移4位,那么久变成了10转换成十进制就是2
第二个数,0xf的二进制是1111,&运算符就是两个二进制作比较,全为1的则1
00101111
00001111
最后的结果就为二进制1111转换成十进制就是15
那么15再向左移4位,结果为11110000转换成十进制就是240
240再加上2就是242
过程明白了,但是原理还不清楚,这可能就是数学方面的知识了
3.第三步首先将真实的flag与刚才运算的数字就行了异或预算,并转换成16进制,再把16进制转换成字符串。那么[2:]的作用就是去掉前面的0x保留内容,zfill是用于填充0的函数,当字符串不满2个的时候,在前面填充一个0
那么代码解读完毕,编写逆向的代码
写完发现,第二步不需要逆向,不过了解下过程也是蛮重要的,这种移位的题目出现还是很多的
result="bcfba4d0038d48bd4b00f82796d393dfec"
result_plus = []
flag=""
list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
for i in range(0,len(result),2):
result_plus.append(int(result[i]+result[i+1],16))
#首先要对result进行处理,重新转换成16进制,并且以数组的形式存放
for i in range(0,len(list)):
key = (list[i]>>4)+((list[i] & 0xf)<<4)
flag+=chr(key^result_plus[i])
#异或运算
print(flag)