import os
def xor(a,b):
assert len(a)==len(b)
c=""
for i in range(len(a)):
c+=chr(ord(a[i])^ord(b[i]))
return c
def f(x,k):
return xor(xor(x,k),7)
def round(M,K):
L=M[0:27]
R=M[27:54]
new_l=R
new_r=xor(xor(R,L),K)#先将前27和后的27异或 然后将得到的27 位再跟k异或
return new_l+new_r#将new_r和new_l拼接起来
def fez(m,K):
for i in K:
m=round(m,i) #一轮轮下去
return m K=[]
for i in range(7):
K.append(os.urandom(27))
m=open("flag","rb").read()
assert len(m)<54
m+=os.urandom(54-len(m)) #不够还得补 test=os.urandom(54)
print test.encode("hex")
print fez(test,K).encode("hex")
print fez(m,K).encode("hex")

刚刚开始想了好久都没想出k是怎么求出来的,最后看了大佬的wp,豁然大悟,原来是消去k。

不过。。。就算这样也搞不出来,看了好久wp才弄明白。

首先,我把一个的过程给写了下来,进行猜想:

 fR7=xor(xor(fL6,fR6),k)
fL7=fR6
fR7=xor(xor(fL5,fR5),k)
fL6=fR5
fR5=xor(xor(fL4,fR4),k)
fL5=fR4
fR4=xor(xor(fL3,fR3),k)
fL4=fR3
fR3=xor(xor(fL2,fR2),k)
fL3=fR2
fR2=xor(xor(fL1,fR1),k)
fL2=fR1
fR1=xor(xor(fL0,fR0),k)
fL1=fR0

另一边也一样的,当到最后的时候tL0和tR0是已知,但要记住,从下往下回归的时候,左右会交换了。

最后发现:

tL7^fL7=tL0^fL0

所以可以将

fL0=tL7^fL7^test[27:54]

这样就能求出另一边了。另一边,也差不多,想方法求得带有fR0^tR0的项,再异或

test[0:27]

就出来了。

下面还有一种大佬的方法:

(tR7^R7)^(tL7^L7)=fL6^tL6
(tR6^R6)^(tL6^L6)=fL5^tL5
(tR5^R5)^(tL5^L5)=fL4^tL4
(tR4^R4)^(tL4^L4)=fL3^tL3
(tR3^R3)^(tL3^L3)=fL2^tL2
(tR2^R2)^(tL2^L2)=fL1^tL1
(tR1^R1)^(tL1^L1)=fL0^tL0

再有:

fR7=fR6
tR7=tR6

就能凑出

(tR6^R6)^(tL6^L6)

之后就能一步一步往下走:就能求出 tL0^fL0 和fL0^tL0

最后给出大佬的博客,大佬真的是厉害。

https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/

这次比赛真的让我自闭了。

05-18 22:43