首页 > 其他分享 >2023CISCN MISC Puzzle

2023CISCN MISC Puzzle

时间:2023-05-30 12:33:05浏览次数:72  
标签:img int MISC Puzzle bytes 2023CISCN tmp4 data size

虽然没有参加,但是这道题我比较感兴趣,bmp拼图,听其他师傅一说,我就感觉有印象,一查发现与22年的春秋杯PINTU类似

要拼图,先要知道原图的宽高,给出的图片宽是不等的,需要我们去计算一下

files = os.listdir('./tmp4')
size = []
for file in files:
    with open('./tmp4/'+file,'rb') as fr:
        data = fr.read(0x1A)
    x = int.from_bytes(data[6:8],'little')
    y = int.from_bytes(data[8:10],'little')
    width = int.from_bytes(data[0x12:0x16],'little')
    height = 100
    size.append([(y,x),(height,width)])
sorted_size = sorted(size,key=lambda x:x[0])
img_height = sorted_size[-1][0][0] + sorted_size[-1][1][0]
img_width = sorted_size[-1][0][1] + sorted_size[-1][1][1]
print(img_height,img_width)
# 4000 7200

这样可以计算得出原图的宽为7200,高为4000,接下来就是根据bmp的保留数据来拼图

from PIL import Image
import os
exp = Image.open('./tmp4/99765296563.bmp')
image = Image.new(exp.mode,(7200, 4000))

files = os.listdir('./tmp4')
for file in files:
    with open('./tmp4/'+file,'rb') as fr:
        data = fr.read(0x1A)
    x = int.from_bytes(data[6:8],'little')
    y = int.from_bytes(data[8:10],'little')
    img = Image.open("./tmp4/"+file)
    image.paste(img,(x,y))
image.save('flag.bmp')

得到图片,不过发现部分内容不正确

仔细观察可以发现这部分图片其实是水平翻转了,这就涉及到一个点,在bmp中,如果一张图的高度为负数,那么这张图片的绘制顺序就会颠倒,从而达到翻转的效果,以刚刚生成的这张图片为例,当将高度修改为负数时,图片颠倒

因此,在拼图时,肯定有小图的高度是负数,需要将这些图片翻转后再拼图

from PIL import Image
from PIL import ImageOps
import os
exp = Image.open('./tmp4/99765296563.bmp')
image = Image.new(exp.mode,(7200, 4000))

files = os.listdir('./tmp4')
for file in files:
    with open('./tmp4/'+file,'rb') as fr:
        data = fr.read(0x1A)
    x = int.from_bytes(data[6:8],'little')
    y = int.from_bytes(data[8:10],'little')
    img = Image.open("./tmp4/"+file)
    height = int.from_bytes(data[0x16:0x1A],'little',signed=True)
    if height < 0:
        img = ImageOps.flip(img) #翻转图片
    image.paste(img,(x,y))
image.save('flag.bmp')

得到图片

第一部分lsb最低位隐写flag{f1R5T_part_1s_LSB_sTeG0_

出题人既然刻意修改了部分图片的高度,那么肯定是有更深的意图的,这些小图的高度分为正负,正好对应了二进制,因此需要按照拼图的顺序将二进制内容输出

from PIL import Image
import os
from Crypto.Util.number import long_to_bytes
files = os.listdir('./tmp4')
msg = []
for file in files:
    with open('./tmp4/'+file,'rb') as fr:
        data = fr.read(0x1A)
    x = int.from_bytes(data[6:8],'little')
    y = int.from_bytes(data[8:10],'little')
    height = int.from_bytes(data[0x16:0x1A],'little',signed=True)
    bin_data = '0' if height < 0 else '1'
    msg.append([(y,x),bin_data])#先排横坐标,再排纵坐标
sorted_msg = sorted(msg,key=lambda x:x[0])#按拼图顺序排序
s = ""
for v in sorted_msg:
    s += v[1]
print(long_to_bytes(int(s,2)))
#2nd_paRT_15_reVeRSe_bMp_

第三部分则是填充字节,bmp是按行绘制的,每行数据都需要为4的倍数,当像素数据不满足这个条件时,会自动填充相应字节的0,出题人修改了这个填充的数据,需要按照拼图的顺序提取这些数据

在写入文件前,可以尝试打印,打印时可以发现文件头是ffd8,典型的jpg文件

from PIL import Image
import os
files = os.listdir('./tmp4')
my_data = []
for file in files:
    with open('./tmp4/'+file,'rb') as fr:
        data = fr.read()
    x = int.from_bytes(data[6:8],'little')
    y = int.from_bytes(data[8:10],'little')
    width = int.from_bytes(data[0x12:0x16],'little',signed=True)
    padding_size = 0 if 4- 3*width%4 == 4 else 4- 3*width%4#计算填充字节
    img_data_size = 3*width#计算数据字节
    length = len(data[54:])#文件头占54字节
    img_data = data[54:]
    padding_data = b''
    for i in range(img_data_size,length,padding_size+img_data_size):
        padding_data += img_data[i:i+padding_size]
    my_data.append([(y,x),padding_data])#先排横坐标,再排纵坐标
sorted_data = sorted(my_data,key=lambda x:x[0])#按拼图顺序排序
padding_msg = b''
for v in sorted_data:
    padding_msg += v[1]
with open('1.jpg','wb') as fw:
    fw.write(padding_msg)
#3rd_parT_1s_paddINGINGING}

因此得到最终flagflag{f1R5T_part_1s_LSB_sTeG0_2nd_paRT_15_reVeRSe_bMp_3rd_parT_1s_paddINGINGING}

标签:img,int,MISC,Puzzle,bytes,2023CISCN,tmp4,data,size
From: https://www.cnblogs.com/WXjzc/p/17442913.html

相关文章

  • 2023ciscn-misc-国粹复现
    说明:此题给出的两个图片,a.png及k.png是分别表示的x坐标和y坐标。然后再用此坐标对题目进行画图,从而得出flag但是由于本人的代码技术有限只能借鉴大佬们的代码然后对其进行分析学习。importnumpyasnpfromPILimportImage classtest():   def__init__(self):......
  • ctfshow刷题笔记-misc入门
    ctfshow-misc入门图片篇(文件结构)misc241.在010Editor中打开文件,根据鼠标自动提示找到图片宽高对应的地方biWidth指定图象的宽度,单位是象素。biHeight指定图象的高度,单位是象素。2.修改图片高度为250px并另存3.打开后得到flagmisc251.从网上找到的脚本(将脚本和图片......
  • [PKUCPC2023] J. Hat Puzzle 题解
    题目链接:http://poj.openjudge.cn/campus2023/J/很荣幸参与了命题。题解的ppt版本在这儿:https://disk.pku.edu.cn:443/link/E4B484E7F3C58A45E9E4FB19C731BF4E.贴一下md版题解,要比ppt版本的简略一些:每个人能够推断出自己帽子颜色的信息,仅有两类:前面的人的帽子情况,以及其......
  • misc刷题
    lsb隐写引用一段百度内容LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,每个像数可以携带3比特的信息。能够使用lsb隐写的图片格式只能是png或bmp,jpg无法实现lsb隐写一般这种隐写可以使用stegsovle破解TTL图片......
  • CTF 在线平台miscwp
    1.图片处理下载附件之后,得到一个gif动图。使用Stegsolve打开。使用gif动图工具,然后一张一张的向后翻, 得到flag{he11ohongke}2.二维码下载附件之后是一个zip压缩包。解压之后得到了一个png的二维码图片。该是有东西藏在图片里面,直接拖到winhex打开。 发现里面有一......
  • 8 Kubernetes Scanner to find Security Vulnerability and Misconfiguration
    https://geekflare.com/kubernetes-security-scanner/YouareusingKubernetes.Great!Howaboutitssecurity?WeallknowthatKuberneteshasbecomeoneofthebestcontainerorchestrationplatformstoday.Morethan80%oforganizationstodayareleveraging......
  • AGC12C Tautonym Puzzle
    AGC012CTautonymPuzzle考虑在\(A\)的前\(100\)位递增地填上\(1\to100\)。如果我们限制\(A\)的后\(100\)位里,\(1\sim100\)每个数最多出现一次。后\(100\)位可以不填满。那么\(A\)中好的子序列数量,就是后\(100\)位里严格上升子序列的数量。问题转化成:构造......
  • MISC刷题心得 与百度,谷歌,github语法总结
    MISC介绍:MISC,中文即杂项,包括隐写,数据还原,脑洞、社会工程、压缩包解密、流量分析取证、与信息安全相关的大数据等。竞赛过程中解MISC时会涉及到各种脑洞,各种花式技巧,主要考察选手的快速理解、学习能力以及日常知识积累的广度、深度。misc几种常见格式文件头:png:89504E47jpg:FFD......
  • CTF-MISC-内存取证(持续更新)
    1.恶意程序注册表题目来源-2021强网杯 附件为未知文件,用010editor查看  7z文件,修改后缀名 解压出一个镜像文件非预期解:根据题目提示,可以搜索注册表申请命令REGQUERY命令,用010editor查看 可以得到答案正确解法可查看这个大佬(30条消息)第五届强网杯全国网络......
  • [230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
    今天在redis中执行setrangename1chun命令时报了如下错误提示:(error)MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabout......