马老师的秘籍
首先拿到图片,扫码尝试一波,发现没有什么异常结果。那么接下来用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到手