menu L1nearのspace
安恒12月月赛 X BJDCTF 4th WriteUp
2621 浏览 | 2020-12-27 | 阅读时间: 约 3 分钟 | 分类: Misc | 标签:
请注意,本文编写于 337 天前,最后修改于 337 天前,其中某些信息可能已经过时。

马老师的秘籍

首先拿到图片,扫码尝试一波,发现没有什么异常结果。那么接下来用binwalk扫一下,发现末尾有zip包,提取出来,发现有3个文件,但是7z打开发现只显示了1个文件,那么应该是有伪加密存在的。一个个修改50 4B 01 02后面的加密位,最后发现只有图片能正常打开。观察这张图片,看起来就是在原图的基础上进行了涂改,那么和原图进行xor分析,得到这样一张图:

那么就可以得到压缩包密码,得到2个txt文件,然后根据其中一个的指示替换成. ! ?后再进行Ook解码,得到flag

FakePic

拿到压缩包,得到这个提示:

首先使用AHPR尝试掩码攻击,发现提示说不是RAR/ZIP压缩文件,那么就知道了,这个文件是RAR5格式的,得用hashcat进行破解。然后破解得到密码:1cpp

得到这样一个提示:

刚开始没有看懂是什么意思。那么康康图片,发现在图片最后有这样一段话:

那么需要我们康康Alpha通道,那么先把前面几个点的Alpha通道打印出来,发现是这样的:

发现这几个数都是2的倍数,且倍数都不大。结合前面的提示(而且提示的长度还为8)。那么就猜测提示的作用是这样的:10132430得这样分1 0 1 3 2 4 3 0,然后这8个为一轮一直循环。如果刚好轮到这个数,算出来的pow(2,x)和Alpha通道的值一样,那么就为1,否则就为0。具体看脚本:

from PIL import Image
pic = Image.open('flag.png')
width,height = pic.size
flag = ''
num = -1
i = [1,0,1,3,2,4,3,0]
for x in range(width):
    for y in range(height):
        if num <= 500:
            num += 1
            if pow(2,i[num % 8]) == pic.getpixel((x,y))[3]:
                flag += '1'
            else:
                flag += '0'
        else:
            print(flag)
            break

得到一串01字符串,随便在线解一下,得到flag:

FakePixel

这题真的太顶了,赛时没出,赛后继续做了下,最后得到了答案

首先打开题目,发现一个794MB的图片,和一个加密脚本,加密脚本很容易懂,这里不加以解释,就是把字符转成图片。那么同理,我们也得把图片转回去,脚本如下:

from PIL import Image
import binascii
Image.MAX_IMAGE_PIXELS = None
picture = Image.open('FakePicture.bmp')
fp = open('zip.txt','w')
picture.LOAD_TRUNCATED_IMAGES = True
width,height = picture.size
result = ''
for y in range(height):
    for x in range(width):
        a = picture.getpixel((x, y))
        result += chr(a[2] & 0xFF)
result = result.replace(' ','').replace('\n','').strip(' ')
fp.write(result)

但是很奇怪的是末尾不知道为啥会有很多NUL,可能是加密那边向上取整导致最后有一些点是空的原因吧,不过不影响,自己手动删除一下即可,然后发现末尾有04034B50,那么很明显,倒序即可:

import binascii
fp = open('zip.txt','r')
fp1 = open('1.zip','wb')
fp1.write(binascii.unhexlify(fp.read())[::-1])

这个过程得很久很久,跑完之后可以得到这样一个压缩包:

下面的注释是Ook编码,得到压缩包密码:dasctf_1s_s0_funny

得到视频以后,看一遍发现有这个东西:

这个是MaxiCode,但是这个图得截的好一点,可能需要多截几次,截的大一点。截完以后在线解得

有说是Citrix CTX1,但是密文没有。

然后重新看一遍视频,发现视频末尾是有一个mp3文件,winhex把末尾的mp3文件提取出来,尝试mp3stego但是不知道密钥。那么这里就用到之前的一个加密,MP3 private_bit隐写,之前的博客在这:https://l1near.top/index.php/2020/05/06/52.html#mceasybgm

同理,直接上脚本:

import re
import binascii
n = 21492
result = ''
fina = ''
file = open('1.mp3','rb')
while n < 2543601 :
    file.seek(n,0)
    n += 384
    file_read_result = file.read(1)
    read_content = bin(ord(file_read_result))[-1]
    result = result + read_content
print result[::-1] #打印出来的解码发现是一堆乱码……于是逆序输出

忽略前面的000000,转字符得到:

23407E5E7A41414141413D3D5C6B6F244B362C4A487E4D4146627A7348665F4D4A297E73484121416E5A625F484243747268324671422F745346416848395F484A5C7E3971332F7E726F327A28475A217D734162715F5A3B364D416628663B4D36294173317E75326432417E28395A5653774129312975777229327748325F413639414D312975775333417E28475A2164417E32314743564A5A7E43285A3B434A217E6671562F667D66325628755A3B6E6E734B4A537E2B6351635A3176425045397A3F5A506F72402340267F555E4D6B32445235456B443054634141413D3D5E237E4000

然后解16进制,得到:

后面这一串解出来的,在西湖论剑线下曾出现过,直接上工具推送门:https://master.ayra.ch/vbs/vbs.aspx

把后面的命名为1.vbe,decrypt出一个1.vbs,vscode打开看结果,得到CTX1密文:

MBGEKAAFNDHGLABFMEGBKCAHNJHMOPEKIJCMLKBPNJHMLMBJIECBOFEAIDCGOFEAIHCCOGEDIDCGOAEFNBHELEBBIDCGLFBANAHFOAEFNEHBODEGNAHFLEBBIDCGLBBENDHGLCBHICCHLGBDIGCDODEGIHCCPKFP

最后密文得到,直接cyberchef一把梭:

flag到手

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!