前言
参加这种线下比赛,氛围感还是十足的,哪怕规模不大,体验不错;
正文
总的来说成绩还算不错,与别人差距也不大,不过对于我负责的 RE 来说,属实是不满意的,因为一道题挺简单的,但是被我给正向的,当时还纳闷啥情况,怎么跑不出来,属于是一脸懵逼,还有一道是要修栈,不然没法动调,拿不到数据;
现在来复盘一下那道 RE:冰冰给我flag可以吗,题解说的是关于 png 的解密;
下载压缩包解压开,有两个文件:
看这熟悉的图标就是两步操作,还好出题人没有为难,能直接反编译出来:
import base58
def enc(stream, file):
text = base58.b58encode(stream)
temp = list(bytes.decode(text))
return temp
if __name__ == '__main__':
fp = open('冰冰给我flag可以吗.png', 'rb')
context = fp.read()
key = context[0]
fp.close()
fp = open('冰冰给我flag可以吗.png', 'wb')
tmp = enc(context, fp)
for i in range(len(tmp)):
tmp[i] = chr(ord(tmp[i]) ^ key)
fp.write(bytes((''.join(tmp)), encoding='utf-8'))
fp.close()
# okay decompiling pypy.pyc
看源码就是把原先 png 的二进制进行了 base58 和异或加密操作,那会脑子短路了,想成了直接跑这个,跑几次就还原成原先的 png 了,然后猜测 flag 就是在图片上;
过程还是很简单的,直接写脚本,
import base58
def re(stream,file):
text=(stream)
temp = list(bytes.decode(text))
return temp
if __name__ == '__main__':
fp = open('冰冰给我flag可以吗.png', 'rb')
context = fp.read()
key = 137
fp.close()
tmp = re(context,fp)
for i in range(len(tmp)):
tmp[i] = chr(ord(tmp[i]) ^ key)
a="".join(tmp)
a=base58.b58decode(a)
with open('a.png','wb') as f:
f.write(a)
print("finish")
要跑一小会时间,等一下就 OK 了,然后查看输出的 a.png:
搞定!
后记
只能说还是得再接再厉吧,希望下次能取得更好的成绩!