WP CTF-Misc 攻防世界 CSFJ0967 Let_god_knows
「附件」
题目描述:
让苍天知道,你不认输?
附件下载解压,得到一个bmp图片
「思路」
使用Stegsolve找图片隐写,在Red plane 0 中发现清晰二维码。
CQR扫码得到flag。
「工具」
- Stegsolve
- CQR
「知识拓展」
转载:官方WP
出题思路
使用传统图片隐写方法LSBS,将270270px的二维码图片分解为2727的方块矩阵,去除上下左右10px宽度的白色边框后变为2525的方块矩阵,将黑色方块看做1,白色方块看做0,变成一个2525的矩阵。
自RGB图0x233*0x233px的位置开始,将二维码的01矩阵隐写入R通道的最后1bit中。
def encode():
img = cv2.imread(data_path + "test.jpg")
flag = cv2.imread(data_path + "flag.png")
start = 0x233
for i in range(start, start + 25):
for j in range(start, start + 25):
if list(flag[(2+i-start)*10-5][(2+j-start)*10-5]) == [255, 255, 255]:
img[i][j][2] = img[i][j][2] & 254 # white: 0
else:
img[i][j][2] = img[i][j][2] | 1 # black: 1
cv2.imwrite(data_path + "Let_god_knows.bmp", img)
解题思路
使用StegSolve工具找到Red plane 0,保存图片后放大即可看到二维码,扫码得flag。
python还原二维码逆过程代码如下:
def decode():
img2 = cv2.imread(data_path + "Let_god_knows.bmp")
start = 0x233
resolve = [[[255, 255, 255] for i in range(27)]]
for i in range(start, start + 25):
col = [[255, 255, 255]]
for j in range(start, start + 25):
if img2[i][j][2] & 1 == 0:
col.append([255, 255, 255])
else:
col.append([0, 0, 0])
col.append([255, 255, 255])
resolve.append(col)
resolve.append([[255, 255, 255] for i in range(27)])
cv2.imwrite(data_path + "recovered.bmp", np.array(resolve))