SECCON 2018 Online CTF Writeup その1

はじめに

SECCON 2018 Online CTF に一人チームで参加したので,その記録です.

結果

  • 得点: 625 points
  • 順位: 126/653

解いた問題

  • Boguscript (Crypto; 162pt)
  • mnemonic (Crypto; 260pt)
  • Runme (Reversing; 102pt)
  • Unzip (Forensics; 101pt)

Writeup

今回は上記の解いた問題のうち,BoguscriptとmnemonicについてのWriteupを書いていく.
RunmeとUnzipについては次回

Boguscript (Crypt; 162pt)

問題

Boguscrypt
Hey, Can you decrypt the file?

file: Boguscrypt.zip

やったこと

ダウンロードしたファイルを解答するとchallenge.pcapdecflag.txt.encryptedが得られる.どうやらdecを使ってflag.txt.encryptedをデコードしろ,ということらしい.

とりあえず,decを実行

$ ./dec 
Key?:AAAA
gethostbyaddr: Unknown host

キーを求められた.gethostbyaddrのエラーが出ていることから,キーはpcapファイルに含まれるホスト名であると予想できる.ということでWiresharkを使ってpcapファイルを調べる.

そんなにパケット数が多くないので流し見ているとDNS通信を発見.

これによると,172.0.0.2の逆引きがcur10us4ndl0ngh0stn4m3と登録されている.
早速これをキーとして入力.

$ ./dec
Key?:cur10us4ndl0ngh0stn4m3
gethostbyaddr: Unknown host

まぁ,172.0.0.2はプライベートアドレスで私の環境ではホスト名が割り当てられていないので当然の結果.

仕方なく,decを逆アセンブル.中身を読んでいく.

$ objdump -d -M intel dec
(...)
080488df <dec>:
 80488df:   55                      push   ebp
 80488e0:   89 e5                   mov    ebp,esp
 80488e2:   53                      push   ebx
(...)
 8048925:   01 d0                   add    eax,edx
 8048927:   0f b6 00                movzx  eax,BYTE PTR [eax]
 804892a:   31 d8                   xor    eax,ebx
 804892c:   88 01                   mov    BYTE PTR [ecx],al
 804892e:   83 45 ec 01             add    DWORD PTR [ebp-0x14],0x1
(...)

すると,dec関数の中でXORを計算していることが分かった.

適当にXORを計算してフラグゲット.

$ python
>>> from pwn import *
>>> with open('flag.txt.encrypted') as f:
...   encrypted = f.read()
... 
>>> xor(encrypted, 'SECCON{')
'3m4nts0oJD\x00\x03Ly\x06Q\x16\x1a\r\x1ck^\x15A\x13D^(\x01T\x04O\x10EjNQBY\n\x0b`HC\r$'
>>> xor(encrypted, 'cur10us4ndl0ngh0stn4m3'[::-1])
'SECCON{This flag is encoded by bogus routine}\n'

mnemonic (Crypto; 260pt)

問題

Read me.

file: mnemonic.txt

やったこと

読めと言われたので読む.

{
    "japanese": [
    [
        "d3a02b9706507552f0e70709f1d4921275204365b4995feae1d949fb59c663cc",
        "ふじみ あさひ みのう いっち いがく とない はづき ますく いせえび たれんと おとしもの おどろかす ことし おくりがな ちょうし ちきゅう さんきゃく こんとん せつだん ちしき ぬいくぎ まんなか たんい そっと",
        "338c161dbdb47c570d5d75d5936e6a32178adde370b6774d40d97a51835d7fec88f859e0a6660891fc7758d451d744d5d3b1a1ebd1123e41d62d5a1550156b1f"
    ],
    [
        "dfc9708ac4b4e7f67be6b8e33486482cb363e81967a1569c6fd888b088046f7c",
        "ほんやく ごうきゅう おさめる たこやき ごかん れいぎ やせる ふるい まんなか てんない だんろ さうな きぼう よくぼう しのぐ よけい こんき みうち らくご いわかん いこく あたためる のはら たぶん",
        "bdadda5bbff97eb4fda0f11c7141bc3ce3de0fef0b2e4c47900858cec639c10187aee4695b1ba462b1dd34b170b62801e68c270b93af62629f4964947a620ed9"
    ],
    [
        "c0f...",
        "??? とかす なおす よけい ちいさい さんらん けむり ていど かがく とかす そあく きあい ぶどう こうどう ねみみ にあう ねんぐ ひねる おまいり いちじ ぎゅうにく みりょく ろしゅつ あつめる",
        "e9a..."
    ],
    ],
    "flag": "SECCON{md5(c0f...)}"
}

これは多分全くわからないやつ.とりあえずググっていく.

「mnemonic 日本語」等のキーワードで調べているうちに,それらしきのサイトを発見.ここに与えられた文字リストを入れると,それっぽい数値が得られた.

どうやら,mnemonic.txtに書かれているのはBIP39という仕様で生成されたリストらしい.ということで,フラグになっている部分の日本語リストの???をwordlistから探すことにする.実装はpythonのmnemonicライブラリを用い,日本語のwordlistはmnemonicライブラリのソースから拝借した.

作成したコードは以下

#!/usr/bin/env python
#coding: utf-8
from mnemonic import Mnemonic

data = u'%s とかす なおす よけい ちいさい さんらん けむり ていど かがく とかす そあく きあい ぶどう こうどう ねみみ にあう ねんぐ ひねる おまいり いちじ ぎゅうにく みりょく ろしゅつ あつめる'
m = Mnemonic('japanese')

with open('wordlist/japanese.txt') as f:
    for line in f:
        try:
            word = line.rstrip().decode('utf8')
            ret = str(m.to_entropy(data % word)).encode('hex')
            if ret.startswith('c0f'):
                print(word)
                print(ret)
        except ValueError:
            pass

これを実行することで,???に入る単語がはいれつで,エントロピーがc0f4d6b07a192ac251d4ee2a34d5f1977d549a2e6d7cbaf9b09485b379cd3f70であることが判明.
フラグはこの値のハッシュ値なので適当に計算してフラグゲット.

$ python search.py
はいれつ
$ python
>>> from pwn import *
>>> 'SECCON{'+md5sum('c0f4d6b07a192ac251d4ee2a34d5f1977d549a2e6d7cbaf9b09485b379cd3f70').encode('hex')+'}'
'SECCON{cda2cb1742d1b6fc21d05c879c263eec}'

続きます

シェアする

  • このエントリーをはてなブックマークに追加

フォローする