强网杯2021 threebody

a这关啊很神奇啊

stegsolve 打开转一转看到这么一张图看了半天 哎我是废物(;′⌒`)

33.PNG

图片放大后发现像素点排列很有规律 010看像素值

34.PNG

35.PNG

按理说正常图像像素点之间差值都不会很大

但是这边以三为周期之间差值很大但是四为周期就很小
试一下给这个图升维处理
bmp图片有个叫bibitcount 就是每个像素所占的字节数
现在**是24 即3个字节 将其改为32 **

36.PNG

就变成新的图片了

37.PNG

然后老样子stegsolve 发现一老头

38.PNG

右上角有一串白点代表藏着信息
dataextra 查看其中信息 alpha red green bule 的0 一个个试下来

blue这边发现了东西 先行后列查看

39.PNG

40.PNG

这老头叫david 著名数学家 大卫希尔伯特
010那边多出来一个通道 而且值和blue的很接近

41.PNG

尝试将reversed通道的值复制给blue
跑脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
with open('threebody.bmp', 'rb') as f:
d = f.read()

w = 580
h = 435
b = 4
l = bytearray(d)
off = l[10]
for i in range(h):
for j in range(w):
l[off+j*b+i*b*w] = l[off+j*b+i*b*w+3]

with open('threebody_new.bmp', 'wb') as f:
f.write(l)

生成新的图片然后再次分析有找到一张不一样的图片

42.PNG

考虑这张图是二维的 图片按照01序列来保存但没有什么结果,并且如果是逐行保存的话不应该出现左上角的区域与其他区域密度明显不同的情况。
前面的三体和大卫联合搜索一下会发现一个网址

https://mp.weixin.qq.com/s/IOSGOJnGyiGoD8J1ITQJlg
希尔伯特曲线
这是一种将高维进行降维处理的一种方法,所以在这里可以将二维的二进制数组转成一维的二进制流。
这边得到的是128128的矩阵128=27应该使用7维的希尔伯特矩阵
用脚本把二维的01矩阵降维成一维的二进制流就能得到隐藏文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
from PIL import Image
from hilbertcurve.hilbertcurve import HilbertCurve

with Image.open('threebody_new.bmp') as img:
arr = np.asarray(img)
arr = np.vectorize(lambda x: x&1)(arr[:,:,2])

for x1 in range(np.size(arr,0)):
if sum(arr[x1])>0:
break
for x2 in reversed(range(np.size(arr,0))):
if sum(arr[x2])>0:
break
for y1 in range(np.size(arr,1)):
if sum(arr[:,y1])>0:
break
for y2 in reversed(range(np.size(arr,1))):
if sum(arr[:,y2])>0:
break

arr = arr[x1:x2+1, y1:y2+1]

hilbert_curve = HilbertCurve(7, 2)

s = ''
for i in range(np.size(arr)):
[x,y] = hilbert_curve.point_from_distance(i)
s += str(arr[127-y][x])

with open('output', 'wb') as f:
f.write(int(s,2).to_bytes(2048, 'big'))

生成一个output的文件是c语言代码

43.PNG

另存为.c 打开发现源码这边11行的位置后面全是空格和tab

44.PNG

45.PNG

把0当作空格 1当作tab转换成二进制流
01100110011011000110000101100111011110110100010000110001011011010100010101101110001101010110100100110000011011100100000101101100010111110101000001110010001100000011011000110001011001010110110101111101
对这一串出来对了大半天
flag{D1mEn5i0nAl_Pr061em}