Bugku MISC做题笔记

简单套娃DX

这一题需要对png图片的结构有所了解。详细可参考https://www.w3.org/TR/png/

幸好每一张图片只有一个错误,逐步调试,就可以发现所有错误,修正即可。具体错误参看python程序中的注释:

import  ossrc_dir = '.\\XD\\'
des_dir = '.\\out\\'
src_files = os.listdir(src_dir)
des_files = os.listdir(des_dir)f_count={0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0}
for fname in src_files:if fname in des_files:continuewith open(src_dir+fname,'rb') as f:srcdata = f.read()#丢掉了文件头标识if srcdata[1:4] != b'PNG':desdata = 0x89504E470D0A1A0A.to_bytes(8,'big') + srcdataf_count[1] += 1#IHDR块长度和标识码被清零elif srcdata[8:0x10] == 0x0000000000000000.to_bytes(8, 'big'):  desdata = srcdata[:8] + 0x0000000D49484452.to_bytes(8,'big') + srcdata[16:]f_count[2] += 1#IHDR宽高值不对elif srcdata[0xc:0x10] == b'IHDR' and srcdata[0x10:0x18] != 0x0000000500000005.to_bytes(8,'big'):  desdata = srcdata[:0x10] +0x5.to_bytes(4,'big') + 0x5.to_bytes(4,'big') + srcdata[0x18:]f_count[3] += 1#IDAT块长度被清零elif srcdata[0x21:0x29] == 0x00000000.to_bytes(4, 'big')+b'IDAT':  if srcdata.index(b'eXIf') >= 0:IDAT_len = srcdata.index(b'eXIf') - 0x29 - 4 -4else:print('[!] Error!! %s'%fname)breakdesdata = srcdata[:0x21] + IDAT_len.to_bytes(4,'big') + srcdata[0x25:]f_count[4] += 1#IDAT块标识被删除elif srcdata[0xc:0x10] == b'IHDR' and srcdata[0x25:0x29] != b'IDAT':  desdata = srcdata[:0x25] + b'IDAT' + srcdata[0x25:]f_count[5] += 1#IHDR头的颜色类型错误elif srcdata[0xC:0x10] == b'IHDR' and srcdata[0x18:0x1A] != 0x0100.to_bytes(2,'big'): desdata = srcdata[:0x18] + 0x0100.to_bytes(2,'big') + srcdata[0x1A:]f_count[6] += 1#IHDR块被放到了倒数第二块,IDAT变为第一块elif srcdata[0xc:0x10] == b'IDAT':  IHDR_block_begin = srcdata.index(b'IHDR') - 4 IHDR_block = srcdata[IHDR_block_begin:IHDR_block_begin+25]desdata = srcdata[:8] + IHDR_block + srcdata[8:IHDR_block_begin] + srcdata[IHDR_block_begin+25:]f_count[7] += 1else:desdata = srcdataf_count[0] += 1with open(des_dir+fname,'wb') as f:f.write(desdata)
print(f_count)

图片修正以后,观察图片内容,应该是二维码碎片。查看每个图片的exif信息,发现数据:

import os
from PIL import Imagebasedir = '.\\out\\'
list = []
for fname in os.listdir(basedir):image = Image.open(basedir+fname)exif = image.getexif()list.append([ int(exif[282]),int(exif[283]) ])image.close()
list.sort(key=lambda x: [x[0], x[1]])
print(list)#[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [0, 8], [0, 9], [0, 10], [0, 11], [0, 12], [0, 13], [0, 14], [0, 15], [0, 16], [0, 17], [0, 18], [0, 19], 
#...
# [449, 0], [449, 1], [449, 2], [449, 3], [449, 4], [449, 5], [449, 6], [449, 7], [449, 8], [449, 9], [449, 10], [449, 11], [449, 12], [449, 13], [449, 14], [449, 15], [449, 16], [449, 17], [449, 18], [449, 19]]

因此这些应该是每个图片的坐标,依据这些坐标进行拼接图片,得到flag:

import os
from PIL import Image
basedir = '.\\out\\'
list = []
newimg = Image.new('RGB',(450*5,20*5),(255,255,255)) #白底
for fname in os.listdir(basedir):image = Image.open(basedir+fname)exif = image.getexif()x,y = int(exif[282])*5,int(exif[283])*5newimg.paste(image,(x,y,x+5,y+5))   image.close()
newimg.save('new.png')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商应该用什么样的服务器?多大带宽?

跨境电商在选择服务器 和带宽时,需要考虑多个因素,包括业务规模、用户数量、网站流量、地理位置等。下面是一些关键考虑因素: 1、服务器类型 跨境电商通常会选择使用云服务器,因为云服务器具有灵活性、可扩展性和高可用性。云服务…

[Redis]——主从同步原理(全量同步、增量同步)

目录 Redis集群: 主从同步原理: replid和offset: 全量同步和增量同步: repl_baklog文件: 主从集群的优化: Redis集群: 部署多台Redis我们称之为Redis集群,他有一个主节点(负责写操作)&…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.16-03.22 #17场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2024-03-16(周六) #5场比赛2024-03-17…

软件测试 —— 测试用例设计报告

写出测试网站的测试用例,测试网站具体内容可看团购网站系统需求说明书1.2.doc 一、流程1:注册→登录 图1:注册->登录流程图 1、 使用场景设计法设计测试用例 1) 找出基本流和备选流 基本流注册用户-成功登录系统备选流1注册…

SAP-MM-型材采购流程细节

1.物料的转换关系—2024年3月14日 2.采购信息记录维护,维护KG的价格和转换关系 维护转换因子 3.创建采购订单(PS:这里有个优先级,优先采购信息记录的转换比例,其次是物料主数据的) 4.采购订单收货 常见问题&#x…

【CesiumJS-5】绘制动态路线实现飞行航线、汽车轨迹、路径漫游等

实现效果 前言 Cesium中,动态路线绘制的核心是借助CZML格式,CZML是一种用来描述动态场景的JSON数组,可以用来描述点、线、多边形、体、模型及其他图元,同时定义它们是怎样随时间变化的; CZML主要做三件事: 1.添加模型信息 2.添加…

矿洞隧道漫游可视化:探索地心深处的奇幻世界

在这个充满好奇与探索的时代,我们总是渴望揭开世界的神秘面纱,探寻那些深藏在地球内部的奥秘。 矿洞隧道漫游可视化系统通过先进的计算机图形学、虚拟现实和三维建模技术,将矿洞隧道的真实场景进行高精度还原,让我们仿佛置身于一个…

【问题】如何启用火狐浏览器网页翻译功能?

如何启用火狐浏览器的翻译网页功能呢? 🍀1 点击浏览器右上角的三道杠,然后点击“扩展和主题”,进入如下页面。 🍀2 在输入框中输入“翻译”,然后开始搜索。 🍀3 从搜索结果中选择一个需要的并点击,例如选择腾讯翻译

【嵌入式开发·Arduino板】I2C接口通讯及应用 | 串口通讯实例 | I2C的类库函数,I2C接口的应用

“跟猫学,保持冷漠,适当撒娇,几乎不动心。跟猪学,保持食欲,充足睡眠,几乎不烦恼。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式,它允许开发者使用不同的标准来过滤一组对象,并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制,这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

phpstudy自定义安装mysql8.3并启动

phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本,选择第一个压缩包文件,下载 下载完成后,解压到phpstudy环境目录下,如下图 然后进入mysq…

python 目录和文件基本操作

目录操作 获取当前目录: import os dir_path os.getcwd() print("当前目录:", dir_path) 当前目录: D:\work\pycharm\object 创建目录: import osdir_path os.getcwd() print("当前目录:", d…