JarvisOJ-[xman2019]xfz


下載附件后,得到了一個py腳本與一個.log的文本,如下:

fez.py:

 1 import os
 2 def xor(a,b):
 3     assert len(a)==len(b)
 4     c=""
 5     for i in range(len(a)):
 6         c+=chr(ord(a[i])^ord(b[i]))
 7     return c
 8 def round(M,K):
 9     L=M[0:27]
10     R=M[27:54]
11     new_l=R
12     new_r=xor(xor(R,L),K)
13     return new_l+new_r
14 def fez(m,K):
15     for i in K:
16         m=round(m,i)
17     return m
18 
19 K=[]
20 for i in range(7):
21     K.append(os.urandom(27))
22 m=open("flag","rb").read()
23 assert len(m)<54
24 m+=os.urandom(54-len(m))
25 
26 test=os.urandom(54)
27 print(test.encode("hex"))
28 print(fez(test,K).encode("hex"))
29 print(fez(m,K).encode("hex"))

fez.log:

50543fc0bca1bb4f21300f0074990f846a8009febded0b2198324c1b31d2e2563c908dcabbc461f194e70527e03a807e9a478f9a56f7
66bbd551d9847c1a10755987b43f8b214ee9c6ec2949eef01321b0bc42cffce6bdbd604924e5cbd99b7c56cf461561186921087fa1e9
44fc6f82bdd0dff9aca3e0e82cbb9d6683516524c245494b89c272a83d2b88452ec0bfa0a73ffb42e304fe3748896111b9bdf4171903

簡單的觀察可以知道要通過已給出的三個輸出,計算出原本的m(也就是flag)。這里要注意的是異或運算本身的特殊性-可逆,因此通過后面兩個式子,fez(test,K),fez(m,K)計算出test與m原始數的[0:27]與[27:54],通過兩者之間相互異或,兩兩抵消,再與給出的test的值異或,即可得到最初的m。這其中最重要的就是抵消掉k的值。

推算結果如下:

已知 entest enm test
設entest的[0:27]為L,[27:54]為R
設enm的[0:27]為ML,[27:54]為MR
設k[]的每個值為k0,k1...k6
則根據算法可知:(通過L和R來推)
原始的test:(逆推)
                 L                                          R     
①     R^k6^L                                                L
②     L^k5^(R^k6^L)                                      (R^k6^L)
③    (R^k6^L)^k4^( L^k5^(R^k6^L) )                       L^k5^(R^k6^L) 
簡     L^k4^k5                                            R^k5^k6
④     L^R^k3^k4^k6                                       L^k4^k5
⑤     R^k2^k3^k5^k6                                      L^R^k3^k4^k6
⑥     L^k1^k2^k4^k5                                      R^k2^k3^k5^k6
⑦     L^R^k0^k1^k3^k4^k6                                 L^k1^k2^k4^k5
原始的enm與test逆推過程一樣:
可得:
                 L                                           R     
       ML^MR^k0^k1^k3^k4^k6                            ML^k1^k2^k4^k5
因此,根據異或運算的可逆性,可得:
test[0:27]^m[0:27]==(L^R^k0^k1^k3^k4^k6 )^(ML^MR^k0^k1^k3^k4^k6)==L^R^ML^MR
test[27:54]^m[27:54]==(L^k1^k2^k4^k5)^(ML^k1^k2^k4^k5)==L^ML

寫腳本得出flag:

from libnum import n2s
from binascii import a2b_hex
test='50543fc0bca1bb4f21300f0074990f846a8009febded0b2198324c1b31d2e2563c908dcabbc461f194e70527e03a807e9a478f9a56f7'
entest='66bbd551d9847c1a10755987b43f8b214ee9c6ec2949eef01321b0bc42cffce6bdbd604924e5cbd99b7c56cf461561186921087fa1e9'
enm='44fc6f82bdd0dff9aca3e0e82cbb9d6683516524c245494b89c272a83d2b88452ec0bfa0a73ffb42e304fe3748896111b9bdf4171903'

test=a2b_hex(test)
entest=a2b_hex(entest)
enm=a2b_hex(enm)
R=entest[27:54]
L=entest[0:27]
MR=enm[27:54]
ML=enm[0:27]
#print(test,"\n",entest,"\n",enm)
ml=''
mr=''
for i in range(27):
    templ=chr((R[i]^MR[i]^L[i]^ML[i]^test[i]))
    tempr=chr((L[i]^ML[i]^test[27+i]))
    ml+=templ
    mr+=tempr

print(ml+mr)

運算結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM