Misc Lab 2:隐写与其他 misc
Challenge 3
- 既然是LSB隐写,直接zsteg启动。

- 发现了隐藏图片,直接提取出来。发现这个隐藏的图片特别像第一题的那少了半张,然后binwalk走一下发现这是一个很标准的png图片。
- 但是zsteg告诉我们
207376 bytes of extra data after image end (IEND), offset = 0x44d8
。
- 但是直接dd出来怎么样也提取不出来有用的信息,所以有可能是CRC校验码和后面的长宽数据被篡改了。
- 用代码修复了一下这个png图片,主要用到了IHDR块的知识,就可以看到flag。
- 关键代码:
new_ihdr = struct.pack('>I', new_width) + struct.pack('>I', new_height) + ihdr[8:13]

Challenge A: Palette Stego (25%)
- 这题是ezstego加密,先解释一下具体的加密算法。
- 首先,这是针对PNG图片的调色板模式,根据所有颜色的亮度对调色板进行重新排序。
- 标准亮度计算公式:
0.299 * r + 0.587 * g + 0.114 * b
- 然后,遍历图片的每一个像素。根据该像素在排序后的调色板中的索引是奇数还是偶数,来隐藏一个比特位(0或1)。
- 如果需要隐藏'0',就选择一个排序后索引为偶数的颜色;如果需要隐藏'1',就选择一个排序后索引为奇数的颜色。
- 既然知道加密算法,那就直接逆向出来就好了。
- 具体的代码也是先使用RGB,计算出每一个像素的亮度值,之后排序,并且建立原index和排序index的表,之后逐行提取。
- 最后就能得到flag:
AAA{gOoD_joB_P4lEtTE_M0D3_c@N_al$0_57E9o!}

Challenge C: Time & Power (30%)
- 到手发现只有一个numpy的数组压缩包,解压缩后发现有三个文件:input_id、input、Power。
- input文件是一个索引,一共是39个不同字符的循环。

- power文件是一个数据包,一共有1053组数据,每组数据有100个float元素,这个大概就是记录功率的。
- 因为1053 = 39x27,所以猜测这里有27组功率图,每组39张图,每张图100个功率点。

- 只需要找出每组里面与众不同的那张图,对应的字符循环的就是那一位的flag。

- 因此我先将这个1053个数据全部保存为折线图,然后分组,查看了前四组,确实对应的flag前4位
0ops
,大多情况是缺一个高峰。
- 但是这样子看效率低下,并且许多模棱两可的情况,所以干脆直接用代码基于原npy数组找不同。
- 这里使用了ai,直接让ai根据我的推理生成了一个基于相关性判断的代码
- 但是ai提取出来的flag有几位不太正确,微调一下就通过了(用肉眼判断的)。
- flag:
0ops{power_1s_a11_y0u_n55d}