Skip to content

Misc Lab 2:隐写与其他 misc


Challenge 3

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

Challenge A: Palette Stego (25%)

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

Challenge C: Time & Power (30%)

  1. 到手发现只有一个numpy的数组压缩包,解压缩后发现有三个文件:input_id、input、Power。
  2. input文件是一个索引,一共是39个不同字符的循环。 input文件内容
  3. power文件是一个数据包,一共有1053组数据,每组数据有100个float元素,这个大概就是记录功率的。
  4. 因为1053 = 39x27,所以猜测这里有27组功率图,每组39张图,每张图100个功率点。 功率图示例
  5. 只需要找出每组里面与众不同的那张图,对应的字符循环的就是那一位的flag。 取余39=26 对应0
  6. 因此我先将这个1053个数据全部保存为折线图,然后分组,查看了前四组,确实对应的flag前4位0ops,大多情况是缺一个高峰。
  7. 但是这样子看效率低下,并且许多模棱两可的情况,所以干脆直接用代码基于原npy数组找不同。
  8. 这里使用了ai,直接让ai根据我的推理生成了一个基于相关性判断的代码
  9. 但是ai提取出来的flag有几位不太正确,微调一下就通过了(用肉眼判断的)。
  10. flag:0ops{power_1s_a11_y0u_n55d}