ぼちぼちCTF

CTF関連

VolgaCTF 2017 Quals writeup

VolgaCTF 2017 Qualsにshpxというチームで参加.
私は日曜に予定が入っていたため土曜のみ参加だった.
チームとしては700点,個人としては150点獲得し117位.
すでにwriteupは出ているが,自分のためにもwriteup書く.

VC (crypto 50)

A.pngとB.pngという画像を渡される.ここからフラグを探し出す.
A.pngとB.pngの差分を取ればフラグが出てくる.
ImageMagickコマンドラインツールで以下のコマンド実行し2つの画像の差分画像を生成.

composite -compose difference A.png B.png diff.png

次のような差分画像が生成され,その中にフラグがある.
f:id:mattun_mart:20170328012218p:plain

この問題他のチームメンバーが先に解いていたのに気づかず自分も解いていた.

Keypass (reverse 100)

入力したパスフレーズから鍵を生成するプログラムkeypassとaes-128-cbcで暗号化されたzipファイルflag.zip.encが渡される.
keypassでいろいろパスフレーズを入力してみると,生成される鍵に結構被りがあることがわかる.

  • ./keypass aa -----> BWf81zF%SdkxL*jL.
  • ./keypass aaaa -----> BWf81zF%SdkxL*jL.
  • ./keypass bbbb -----> BWf81zF%SdkxL*jL.

ここでおそらく生成される鍵のパターンはそこまで多くなく,総当たりでいけそうと予想.
とりあえずアルファベットと数字を使った4ケタのパスフレーズから鍵を生成して復号してみるとすぐに復号できた.
ただし,ヒントにOpenSSL 1.1.0eが使われていることが書かれているため,このバージョンを使用する必要がある.

# -*- coding:utf-8 -*-
from itertools import product
import subprocess

chars = 'abcdefghijklmnopqrstuvwxyz1234567890'
key_list = []
patterns = product(chars, repeat=4)
for pt in patterns:
	command = "./keypass " + ''.join(pt)
	key = subprocess.check_output(command.split(" "))
	if key not in key_list:
		key_list.append(key)
		key = key.strip()
		
		command = "openssl enc -aes-128-cbc -d -pass pass:\"" + key + "\" -in flag.zip.enc -out flag.zip"
		proc = subprocess.Popen(command.strip(" "), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

		result = proc.stdout.read()
		proc.wait()

		if proc.returncode == 0:
			print "decrypt OK"
			print key
			break

あとは復号したzipファイルを解凍してフラグゲット.

$python decrypt.py
decrypt OK
\M)R<.DDe/:;d>JZP

$unzip flag.zip
Archive:  flag.zip
 extracting: flag.txt 

$cat flag.txt
VolgaCTF{L0ve_a11_trust_@_few_d0_not_reinvent_the_wh33l}

ちょっと試したらすぐに解けてしまったためあまり逆アセンブルしたコードを読んでいないが,鍵生成処理はパスフレーズの各文字のXORを取った値をseedとしてパスフレーズを生成しているらしい.

 4004e8: 48 0f be 07           movsx  rax,BYTE PTR [rdi]
 4004ec: 48 83 c7 01           add    rdi,0x1
 4004f0: 48 31 c2              xor    rdx,rax
 4004f3: 48 39 cf              cmp    rdi,rcx
 4004f6: 75 f0                 jne    4004e8 <__libc_start_main@plt+0x68>

結局256通りに絞られるみたい.

感想

その他にもAngry Guessting Gameなどにトライしていたが,reversing力全然足りてない感をかなり感じた.
少しずつレベル上げていきたい.