- A Simple Cipher——来自[Tokyo Westerns CTF 3rd 2017]
总结:这道题卡了很久,一开始粗暴的想爆破,发现13位的key可能会跑死机,于是仔细看代码发现固定位可以利用。但还是又卡住了,因为忘记了从21开始才是第22位ORZ(以后写代码记得检查一下数字……)
Q:简单来说就是给了python的加密源代码和输出结果,要你把输入变量跑出来。
看了下源代码发现几个点:message有个固定位已知,key长度13,message[i]+enc[i]+key[i%13] % 128 = enc[i+1]
- 首先string.decode('hex')得到encrypted='|\x15:GKj-?}?s(p>l-$:\x08>.w<ETwHf|\x15\x113?Ot^',Len(encrypted) =36。则len(message)=35,又由于len(key)=13,则len(flag)=21。
由此,message[21]='|',而encrypted已知,可以一个个根据message[(i % 13)+22] = enc[i+1]-message[i]- enc[i] % 128算出来,从message[21:]用个循环先把key跑出来。再把flag跑出来。