buuctf密码学EasyProgram

buuctf密码学EasyProgram

这题有点好玩
buuctf密码学EasyProgram_第1张图片
题目给了两个附件file.txt和附件.txt
在limian述
buuctf密码学EasyProgram_第2张图片
buuctf密码学EasyProgram_第3张图片
这是什么代码????百度后发现这是伪代码。。现在连伪代码都认不出来了。代码还行,大概可以看出来意思,就是set有点坑。观察到伪代码最后两句:

 set flag[m]:flag[m]^s[x]

fprint flagx to file


其他的代码好像没有和flag直接运算,和flag运算的只有一句,那就是^运算,不难知道,异或运算是可逆的,即异或密文可以得到明文。而且观察到最后一个for循环有38次,但是flie里面长度好像并没有38,所以不能直接复制粘贴。拖入winhex:

buuctf密码学EasyProgram_第4张图片
数了一下发现16进制值刚好38个,整体思路就出来了,写脚本:

flag = [0x00,0xBA,0x8F,0x11,0x2B,0x22,0x9F,0x51,0xA1,0x2F,0xAB,0xB7,0x4B,0xD7,0x3F,0xEF,0xE1,0xB5,0x13,0xBE,0xC4,0xD4,0x5D,0x03,0xD9,0x00,0x7A,0xCA,0x1D,0x51,0xA4,0x73,0xB5,0xEF,0x3D,0x9B,0x31,0xB3]
key = "whoami"
s = []
t = []
flags = ""
for i in range(256):
    s.append(i)
for i in range(256):
    t.append(key[i%len(key)])
j = 0
for i in range(256):
    j =(j+s[i]+ord(t[i]))%256
    s[i],s[j] = s[j],s[i]

i = 0
j = 0
for m in range(38):
    i=(i+1)%256
    j=(j+s[i])%256
    s[i],s[j] = s[j],s[i]
    x=(s[i]+(s[j]%(256)))%(256)
    flags+=chr(flag[m] ^ s[x])
print(flags)

得到flag:
buuctf密码学EasyProgram_第5张图片

你可能感兴趣的:(ctf,crypto,算法,密码学,python)