「配枪朱丽叶。」

RootのCTF学习笔记。

北京工业大学(GXYCTF2019)MISC部分做题记录。

gakki

对图片进行文件提取,得到加密的rar压缩文件。
用ARCHPR进行爆破得到密码是8864
得到一堆意义不明的字符:
https://s2.ax1x.com/2019/12/25/lFaW8A.png

emmm。。算是做题经验吧,想到了词频统计,用TextDecoderToolkit这个工具很方便,得到flag:
https://s2.ax1x.com/2019/12/25/lFa5KP.png

佛系青年

一个压缩包,里面有一个未加密的1.png,不过没啥卵用,还有一个加密的fo.txt。
把1.png拿出去,然后修改压缩包的加密位,发现可以打开fo.txt。
https://s2.ax1x.com/2019/12/25/lFd3RA.png
最底下的那句话利用与佛论禅解密得到flag

SXMgdGhpcyBiYXNlPw==

这道题当时做的时候没出来。。学习了一哈。考察的是base64隐写
参考资料:base64隐写 - 简书
https://upload-images.jianshu.io/upload_images/12067578-0d035da90a88270a.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/549

如图,那么我们就可以在加粗的0的位子用二进制隐写(改成其他的二进制数)。这样子做,不影响原文的还原(因为解码的时候加粗位置被改的数是要被删除的),唯一的区别就是,上图的QQ==中第二个Q会变化,QkM=的M会变化,所以base64可以用于隐写

解密脚本:

def get_base64_diff_value(s1, s2):
    base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    res = 0
    for i in xrange(len(s2)):
        if s1[i] != s2[i]:
            return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
    return res


def solve_stego():
    with open('3.txt', 'rb') as f:
        file_lines = f.readlines()
        bin_str = ''
        for line in file_lines:
            steg_line = line.replace('\n', '')
            norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
            diff = get_base64_diff_value(steg_line, norm_line)
            print diff
            pads_num = steg_line.count('=')
            if diff:
                bin_str += bin(diff)[2:].zfill(pads_num * 2)
            else:
                bin_str += '0' * pads_num * 2
            print goflag(bin_str)


def goflag(bin_str):
    res_str = ''
    for i in xrange(0, len(bin_str), 8):
        res_str += chr(int(bin_str[i:i + 8], 2))
    return res_str


if __name__ == '__main__':
    solve_stego()