[BUUCTF]洞拐洞拐洞洞拐
[BUUCTF] 洞拐洞拐洞洞拐
问题链接:https://buuoj.cn/challenges#洞拐洞拐洞洞拐
问题附件是一张图片。
一. 图片分析
查看图片,发现是由有规律的黑白像素构成的PNG图片,用Python脚本尝试以黑色为1,白色为0分别按行读取,发现00xxxxxx00.......的规律,按照char 型读取,发现都是可打印字符,读取及转换代码如下:
#使用:.\hb黑白像素块10.py 2239f085-4e8c-425b-9e8e-793c982c42f5.png
#author:CHTXRT
from PIL import Image
import sys
img = Image.open(sys.argv[1])
temp = ''
n = 0
for x in range(320):
for y in range(320):
n+=1
if(img.getpixel((x,y))==(255,255,255)):
temp += '0'
else:
temp += '1'
if(n==8):
n = 0
print(chr(int(temp,2)),end='')
temp = ''
img.close()
得到结果:
52494646FC18000057415645666D742010000000010001000A000000140000000200100064617461D8........(以下省略n行)
二. 音频分析
上边那串数据看起来像个文件,把它扔到编辑器里面,发现 .wav文件头。

改名2333.wav 保存,用Audacity 打开如图所示:

是个单声道音频(important),观察音频,列出部分音阶:
-0.5 -0.5 0.5 -0.5 0 -0.25 -0.5 -0.25 1.0 -0.5 -0.75 ......(以后省略n项)
发现每段只有 8 种可能:-0.75 -0.5 -0.25 0.0 0.25 0.5 0.75 1.0
盲猜一波八进制,转换前半部分得到 115132127107 ,如果按3个拆分,可以得到 77 90 87 71 ,都属于Ascii 可打印字符,用Python 脚本进行转换,代码如下:
#使用:.\wv音频处理.py 2333.wav
#author: CHTXRT
import sys
import wave
import struct
wav = wave.open(sys.argv[1],'r')
frame = wav.getnframes()
data = wav.readframes(frame)
h = [0]*(len(data)//2)
for i in range(len(data)//2):
h[i] = (struct.unpack('<h',data[i*2:i*2+2]))[0]
hmax = 32767
temp = ''
for i in range(0,len(h),10):
temp += str(round(h[i]/hmax*4)+3)
if(len(temp)==3):
print(chr(int(temp,8)),end='')
temp = ''
#其中 wave 转换采用的相关 wav 格式知识见下文第四节。
得到一段数据如下:
MZWGCZ33G44GGNRTHE3DEMZSGQ4TQMZQMY2WCNRZGZSDCOBYHBRGMMZUMFSWIMZSGVRTQY3DGIZWIZDBO5SDKML2PJYXUMRTGMZTGYLBPU
三. 编码分析
上边那段文字看起来像段密文,如果是做题做多了或者熟悉Base系列的同学可能会一眼盯真,看出前四个字正是flag的 Base32 编码,不熟悉的同学可以使用相关枚举脚本查看(懒得写了,以后可能补),解密明文如下:
flag{78c639623249830f5a696d1888bf34aed325c8cc23ddawd51zzqz23333aa}
四. wav 分析
本节作为补充知识,勉强算是我在编写上述脚本时学习的记录吧。
对于 wav 文件来说,它的音频由许多采样点构成,每个采样点占用 2 或 4 个字节(单声道音频就是 2 字节,双声道就是 4 个字节,高八位是左声道,第八位是右声道),每个声道的采样数据是一个短整数(int_8),同时我们还应该着重注意的是,wav 文件的数据是小端存储的,所以我们应该先读后四位,再读前四位 [1]。
#使用:.\wv音频处理.py 2333.wav
#author: CHTXRT
import sys
import wave
import struct
wav = wave.open(sys.argv[1],'r')
frame = wav.getnframes()
data = wav.readframes(frame)
h = [0]*(len(data)//2)
for i in range(len(data)//2):
h[i] = (struct.unpack('<h',data[i*2:i*2+2]))[0] #[1] unpack方法中的第一个参数中,‘<’代表小端存储读取
hmax = 32767
temp = ''
for i in range(0,len(h),10):
temp += str(round(h[i]/hmax*4)+3)
if(len(temp)==3):
print(chr(int(temp,8)),end='')
temp = ''
以上内容仅供参考,水平不高,大佬见笑。
下一篇文章:对如何在博客园中添加音乐播放器及设置自动播放的研究 ——CSDN
作者:CHTXRT
出处:https://www.cnblogs.com/chtxrt/
本站使用「CC BY-SA 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
[BUUCTF]洞拐洞拐洞洞拐的更多相关文章
- 三维网格补洞算法(Poisson Method)
下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...
- TCP打洞和UDP打洞的区别 (转)
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S. 如果A和B想要进行UD ...
- UDP 打洞 原理解释
终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one o ...
- [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
[转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching) http://www.360doc.com/content/12/0428/17/6187784 ...
- 【转】NAT路由器打洞原理
什么是打洞,为什么要打洞 由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换. 下面是我在网上找到的一副图 一般来说都是由私网内主机(例如上图中“ ...
- APUE学习笔记(2):lseek()练习与文件洞
对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...
- p2p 打洞技术
根据通信双方所处网络环境不同,点对点通信可以划分成以下三类:i> 公网:公网ii>公网:内网iii>内网:内网前两种容易实现,我们这里主要讨论第三种.这其中会涉及到NAT和NAPT的 ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...
- NAT穿透(UDP打洞)
1.NAT(Network Address Translator)介绍 NAT有两大类,基本NAT和NAPT. 1.1.基本NAT 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N ...
- UDP打洞原理及代码
来源:http://www.fenbi360.net/Content.aspx?id=1021&t=jc UDP"打洞"原理 1. NAT分类 根据Stun协议 ...
随机推荐
- 日志处理logging
前言 什么是日志?有什么作用?日志是跟踪软件运行时所发生的事件的一种方法,简单来说它可以记录某时某刻运行了什么代码,当出现问题时可以方便我们进行定位. 由python内置了一个logging模块,用户 ...
- 微信小程序仿手机相册组件——简单版
仿手机相册的微信小程序组件,具备点击图片预览,长按图片出现多选框功能,读者可以根据自己的需求,依据现有数据进行删除等操作.话不多说,先看效果: 初始效果: 长按效果: 选择效果: 注意:当前只是简单 ...
- 更改DataFrame列顺序
使用pandas进行数据分析的时候,有时会由于各种需求添加了一些列.可是列的顺序并不能符合自己的期望.这个时候就需要对于列的顺序进行调整. import numpy as np import pand ...
- 解决 net core 3.x 跨域问题
跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 以下几种情况是造成跨域的原因: 域名相同,端口不同 域名相同,协议不同(即,一个 ...
- webpack中 hash chunkhash
hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容发生改变的话,那么对应文件hash值也会改变,对应的HTML引用的URL地址也会改变, ...
- Springboot实现验证码登录
Springboot实现验证码登录 1.背景 本人近期正在完成毕业设计(旅游信息管理系统)的制作,采用的SpringBoot+Thymeleaf的模式.在登录网站时想要添加验证码验证,通过网上查找资料 ...
- 使用SVN搭建本地版本控制仓库
使用SVN搭载本地版本控制仓库[转] 如果是在公司,都是有云服务器,项目负责人都是把项目放在服务器上,我们直接用SVN地址就可以实现更新和下载项目源码,那么如果我们自己想使用SVN在本机管理自己写的一 ...
- 23、有一个字符串,包含n个字符,编写一函数,将此字符串中从第m个字符开始的全部字符串复制成另一个字符串
/* 有一个字符串,包含n个字符,编写一函数,将此字符串中从第m个字符开始的全部字符串复制成另一个字符串 */ #include <stdio.h> #include <stdlib ...
- Kubernetes—资源管理
3. 资源管理 3.1 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中 ...
- Objects.requireNonNull的意义是什么
Objects.requireNonNull方法的源码是这样: public static <T> T requireNonNull(T obj) { if (obj == null) t ...