这个题目先做出来,晚发布,因为做着下一道题卡住了,忘了来写博客记录了,现在补上,这道题其实不难,就是我语文水准不好
贴上代码先
import numpy as np #取随机库
flag = 'redacted'
np.random.seed(12345)#给个seed取随机数
arr = np.array([ord(c) for c in flag])#创建一个数组 为字符转数字的
other = np.random.randint(1,5,(len(flag)))#生成范围为1-5,长度为flag的数组
arr = np.multiply(arr,other)#将两个数组相乘
b = [x for x in arr]
lmao = [ord(x) for x in ''.join(['ligma_sugma_sugondese_'*5])]
c = [b[i]^lmao[i] for i,j in enumerate(b)] #这是生成带序号的一个list
print(''.join(bin(x)[2:].zfill(8) for x in c))#zfill是填充0如果没8位,bin(x)[2:]是去掉0b的前缀,这都是调试过后得到的,自己也可以做
# original_output was 1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101
这里有一个库和库里的很多函数我都不认识,一个个百度,我给你写上注释了,
起初我以为程序运行结果是下面那个注释,结果浪费好长时间,实际不是的
运行这个py得到
1001110101010001110101111101011110000001010110111101011100101011001
len一下得到67
redacted 求len一下8
也就是说,8位或者9位对应一个字符
然后原文中的提示,求len一下 2012
然后202/8一下子喽,25,为什么要25,不除以9呢,自己调试就懂了,然后此题目,前后的代码不是有一串串联系的,所以比较好搞,下一题就比较复杂点,所以一位位爆破就可以了,25位,25*(127-30),爆破次数不大,可以进行
最后贴上代码
#!/usr/bin/env python
# coding=utf-8
import numpy as np
key="1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101"
flag=""
ans=""
for i in range(25):
for w in range(30,127):
flag=ans+chr(w)
np.random.seed(12345)
arr = np.array([ord(c) for c in flag])
other = np.random.randint(1,5,(len(flag)))
arr = np.multiply(arr,other)
b = [x for x in arr]
lmao = [ord(x) for x in ''.join(['ligma_sugma_sugondese_'*5])]
c = [b[i]^lmao[i] for i,j in enumerate(b)]
temp=''.join(bin(x)[2:].zfill(8) for x in c)
if temp[len(temp)-9:len(temp)]== key[len(temp)-9:len(temp)]:
ans+=chr(w)
print ans
break
这是我练习python的东东,所以大部分代码还是抄大神的writeup,逻辑理解完就好,最后那个判断便是一位位判断对不对,其实可以直接输出flag就不会这么多了
附上题目:链接: https://pan.baidu.com/s/13fz6KCLpEO19rUxm4B2eeA 密码: vt4p