2021年“绿城杯”网络安全大赛-Reverse-[warmup]easy_re
题目名称:[warmup]easy_re
题目内容:热身题,逆向
题目分值:100.0
题目难度:容易
相关附件:[warmup]easy_re的附件.zip
解题思路:
main函数看到最后发现关键比较
分析得知v21是输入,v16是大数数组
这里ida将v16后面的值分成了别的变量,实际上也在v16之中
前两个循环用python模拟得到了v24的值
v16=[ 0xF5, 0x8C, 0x8D, 0xE4, 0x9F, 0xA5, 0x28, 0x65, 0x30, 0xF4,
0xEB, 0xD3, 0x24, 0xA9, 0x91, 0x1A, 0x6F, 0xD4, 0x6A, 0xD7,
0x0B, 0x8D, 0xE8, 0xB8, 0x83, 0x4A, 0x5A, 0x6E, 0xBE, 0xCB,
0xF4, 0x4B, 0x99, 0xD6, 0xE6, 0x54, 0x7A, 0x4F, 0x50, 0x14,
0xE5, 0xEC]
v23="tallmewhy"
v24=[]
v22=[]
for i in range(256):
v24.append(i)
v22.append(ord(v23[i%len(v23)]))
v6,v7=0,0
while v6<255:
v8=v24[v6]
v7=(v7+v22[v6]+v8)%256
v24[v6] = v24[v7]
v6 += 1
v24[v7]=v8^0x37
最后一个循环有一个异或,输入和v24按字节异或,得到的和v16比较
直接将v16和v24异或得到输入
v12=0
v9,v10,v20=0,0,0
while v12+1<42:
v9=(v9+1)%256
v11=v24[v9]
v10=(v10+v11)%256
v24[v9]=v24[v10]
v24[v10] = v11
v12 = v20
v16[v20]^=v24[(v11+v24[v9])&0xff]
v16[v12]=chr(v16[v12])
v20 = v12 + 1
print(''.join(v16))
print得到flag{c5e0f5f6-f79e-5b9b-988f-28f046117802}