matrk's blog

十中八九Python書いてる

seccon warsのライトアップ(?)

私の所属するサークルがSECCON2015 Onlineなんちゃらに参加している最中私はマイクラやってました。

今朝7時くらいになってから参加して1問解いて寝て起きたら予選終わってたので解けた1問についてライトアップ(っていうんですかね)します。

なんかこれを解けって問題でした。あからさまにQRコードが。

Pillow(PIL)使えば楽かなーって思ったのでひょひょって書きました。Python書くの久々すぎて割と手間取った

#!/usr/bin/env python3
# coding: utf-8

from PIL import Image, ImageDraw

IMAGE_SIZE = (2534, 1770)
IMAGES = ['%02d.png' % i for i in range(20)]

mask = lambda x, y: x|y
def duplicator(res, imgmaps):
    for origin, add in zip(res, imgmaps):
        yield tuple(map(mask, origin, add))

def collector(images):
    for src in images:
        img = Image.open(src)
        rgb = img.convert("RGB")
        yield rgb.getdata()

if __name__ == '__main__':
    image = Image.new("RGB", IMAGE_SIZE)
    res = image.getdata()

    imgmaps = collector(IMAGES)

    for imgmap in imgmaps:
        res = list(duplicator(res, imgmap))

    image.putdata(res)
    image.save('result.png')

ドットのRGBでORとって黒を浮き彫りにしてます。OR取れば0に近い方の値が削られますからね。白浮かせたかったらAND。たぶん。

なんでduplicator(コピー機)?それはなんか私がduplicateを合成的な意味だと思っていたからです。語彙。どんな命名が良かったんだろう

で、使い方はスクショ撮って並べて、IMAGESにいい感じに連ねるだけです。動画流しながらスクショ撮りまくって20枚くらいまとめたらいい感じになりました。

IMAGE_SIZEは適切な値(画像サイズ横x縦)にしてくれないと死ぬ。そして撮ってくる画像のサイズも全て統一されてないと死ぬ。私はウィンドウキャプチャしたからこんなキモい値になってるけど、これ全画面キャプチャの方が体にいいですね。

できるのがこれ

f:id:matrk:20151206180445p:plain

で、ここに投げてデコードしました。そんだけ

あとはバイナリエディタのスクショのやつ、OCRにかけてこのバイナリそのまま実行すればいいんじゃねとか思ったけどGoogleDriveのOCRのやり方わからなかったので寝ました。 そもそも実行できるほどのサイズじゃないような気もする。パケットにも見えないしバイナリわかんね

追伸

他の人のライトアップ見たらなんかのソフト使ってめっちゃ効率よくやっててワロタ。