emiru.png该标志被隐藏,结果和脚本被编译到 tar.gz 中。过程很简单:用0到2之间的随机数来存储r、g、b的低1位中的一位。
我们需要知道随机数种子,但由于它接近生成 tar.gz 的时间,因此我们将使用它。
使用 tar 检查时间戳。
留言
$ tar -t -v --full-time -f hugtto.tar.gz
-rw-rw-r-- ptr/ptr 1346615 2019-08-01 14:07:10 ./steg_emiru.png
-rw-rw-r-- ptr/ptr 1009 2019-08-01 14:06:22 steg.py
编写解码器时要注意图像处理的时区和垂直方向。
from PIL import Image
import random
import datetime
img = Image.open("steg_emiru.png")
width, height = img.size
bin_prefix = []
for c in "KosenCTF{":
for i in range(8):
bin_prefix.append((ord(c) >> i) & 1)
approx = int(datetime.datetime.strptime(
'2019-08-01 14:00:00', '%Y-%m-%d %H:%M:%S'
).timestamp())
for seed in range(approx, approx + 0x1000):
random.seed(seed)
bin_flag = []
for i in range(len(bin_prefix)):
x, y = i // width, i % width
rnd = random.randint(0, 2)
r, g, b = img.getpixel((x, y))
if rnd == 0: bin_flag.append(r & 1)
if rnd == 1: bin_flag.append(g & 1)
if rnd == 2: bin_flag.append(b & 1)
if bin_flag[i] != bin_prefix[i]:
break
else:
print("[+] Found seed: {}".format(seed))
break
else:
print("[-] Invalid approx")
exit(1)
random.seed(seed)
flag = ""
char = []
for i in range(8 * 128):
x, y = i // width, i % width
rnd = random.randint(0, 2)
r, g, b = img.getpixel((x, y))
if rnd == 0: char.append(r & 1)
if rnd == 1: char.append(g & 1)
if rnd == 2: char.append(b & 1)
if len(char) == 8:
x = 0
for j in range(8):
x |= char[j] << j
flag += chr(x)
char = []
print(flag)