【记】2021年 “和美杯” 金华市网络安全技能竞赛

前言

参加这种线下比赛,氛围感还是十足的,哪怕规模不大,体验不错;

正文

总的来说成绩还算不错,与别人差距也不大,不过对于我负责的 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:

搞定!
 

后记

只能说还是得再接再厉吧,希望下次能取得更好的成绩!

猜你喜欢

转载自blog.csdn.net/weixin_46263782/article/details/120769639