# CpawCTF Level 2 writeup

2021/05/09

そうだCTFやろうと思って、CpawCTFという練習サイトの問題を解いたのでwriteupします。

CpawCTFのサイトはこちら (opens new window)

# Q13.[Stego]隠されたフラグ

初めは問題文からするにステガノグラフィかなと思いました。

青い空を見上げればいつもそこに白い猫 (opens new window)でいろいろ画像をいじったのですが何も見当たらなかった。

悩んだのですが、

目を凝らして画像を見てみると、すみっこに何かが…!!!!

このすみっこにある記号たち、上か下かの二種類しか配置場所がなく、かつ上が必ず横長の棒で、下が必ず点でした。

モールス信号かなと思い、モールス信号変換サイトに打ち込んでみたらフラグらしき文章が現れました。

# Q15.[Web] Redirect

果たしてリダイレクトはどのようにされているのだろうか…

という問題文だったので、HTTPヘッダを見る。

curl -I http://q15.ctf.cpaw.site
1

普通に302 FoundLocationヘッダでのリダイレクトでした。

HTTPヘッダにX-Flagというヘッダがあり、この値がフラグ。

# Q16.[Network+Forensic]HTTP Traffic

WireSharkでpcapファイルを開く。

ファイル => オブジェクトをエクスポート => HTTP => 全て保存

htmlファイルに拡張子をつけ、js/css/imgのディレクトリ構造を、htmlファイルに記載の内容から整え、ブラウザで開く

# Q17.[Recon]Who am I ?

ツイッターで検索したらゲーム画面のスクショが出てきたので、ツイートの内容と画像の内容を照らし合わせる。

# Q18.[Forensic]leaf in forest

拡張子がないのでなんのファイルかなというところから。

$ file misc100
misc100: tcpdump capture file (little-endian) - version 0.0, capture length 1869357413)
1
2

パケットキャプチャファイルらしいのですが、WireSharkでもtcpdumpでも開けない。

stringsコマンドで可読部分をとりあえず見てみようと思ったら、大量の、、、

lovelive!lovelive!lovelive!lovelive!lovelive!lovelive!lovelive!

問題文がleaf in forestなので、forestたるlovelive!を取り除いてみると、フラグらしきものが出てくる。

strings misc100 | sed -e 's/[lovelive!]//g'
1

# Q19.[Misc]Image!

$ file misc100.zip
misc100.zip: OpenDocument Drawing
1
2

OpenDocument Drawingってなんぞと思ってググると、*.odgなる拡張子がつくお絵かきファイルのようでした。

ちゃんとやるならLibreOfficeとかインストールして、拡張子を.zipから.odgに変更してみればいいのですが、.otdに変換するとMicrosoft Wordでも見れました。

# Q20.[Crypto]Block Cipher

C言語のソースコードが与えられます。

main関数は、引数を二つとるようです。一つ目が暗号文、二つ目が数字です。

暗号文の文字列を、引数で与えられた数字ぶん転置する転置暗号(Block Cipher)のようです。

とりあえずコンパイルした上で、暗号文は問題で与えられているので、数字をいくつかでたらめに入れてみます。

$ gcc crypto100.c
$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 1
$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 2
$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 3
$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 4
1
2
3
4
5

4番目で意味を成す文字列が出てきて、これがフラグ。

後から思えば、大文字Yの場所に着目してはじめから4を入れればよかった。

# Q21.[Reversing]reversing easy!

$ file rev100
rev100: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=f94360edd84a940de2b74007d4289705601d618d, not stripped
1
2

実行ファイルらしいので、とりあえずstringsで中身を見てみると、フラグを示すcpawなる文字列に続いて答えらしきものが見えます。

が、変換処理とかあるかもしれないので、radare2でもうちょっとちゃんと見ます。

$ radare2 rev100
[0x080483a0]> aaa
[0x080483a0]> afl # main関数が見つかる
[0x080483a0]> s main
[0x0804849d]> pdc # 逆アセンブル
function main () {
    //  7 basic blocks

    loc_0x804849d:

     //DATA XREF from 0x080483b7 (entry0)
       push ebp
       ebp = esp
       esp &= 0xfffffff0
       esp -= 0x50              //'P'
       eax = dword gs:[0x14]    //[0x14:4]=-1 ; 20
       dword [local_4ch] = eax
       eax = 0
       dword [local_46h] = 0x77617063 //[0x77617063:4]=-1
       word [local_4ah] = 0x7b  //'{' ; [0x7b:2]=0xffff ; 123
       dword [local_20h] = 0x79 //'y' ; [0x79:4]=-1 ; 121
       dword [local_24h] = 0x61 //'a' ; [0x61:4]=-1 ; 97
       dword [local_28h] = 0x6b //'k' ; [0x6b:4]=-1 ; 107
       dword [local_2ch] = 0x69 //'i' ; [0x69:4]=-1 ; 105
       dword [local_30h] = 0x6e //'n' ; [0x6e:4]=-1 ; 110
       dword [local_34h] = 0x69 //'i' ; [0x69:4]=-1 ; 105
       dword [local_38h] = 0x6b //'k' ; [0x6b:4]=-1 ; 107
       dword [local_3ch] = 0x75 //'u' ; [0x75:4]=-1 ; 117
       dword [local_40h] = 0x21 //'!' ; [0x21:4]=-1 ; 33
       word [local_15h] = 0xa7d //[0xa7d:2]=0xffff ; 2685
       byte [local_17h] = 0
       dword [local_1ch] = 5
       eax = dword [local_46h]  //0x46 ; 'F' ; 70 ; "cpaw{"
       dword [local_4h] = eax
       dword [esp] = 0x8048620  //[0x8048620:4]=0x7325
                                                                           
       int printf(const char * format : (*0x8048620)0x00177fa0 = %s)
       var = dword [local_1ch] - 5 //aeim.fd ; [0x5:4]=-1
       if (!var) goto 0x804855e //unlikely
       {
        loc_0x804855e:

         //JMP XREF from 0x08048536 (main)
           eax = dword [local_15h]  //0x15 ; 21
           dword [local_4h] = eax
           dword [esp] = 0x8048620  //[0x8048620:4]=0x7325
                                                                               
           int printf(const char * format : (*0x8048620)0x00178000 = %s)
           eax = 0
           edx = dword [local_4ch]  //[0x4c:4]=-1 ; 'L' ; 76
           edx ^= dword gs:[0x14]
           if (!var) goto 0x8048589 //unlikely
           {
            loc_0x8048589:

             //JMP XREF from 0x08048582 (main)
               leave                    //ebp ; "%s"
               return
            loc_0x8048584:

               void __stack_chk_fail(void) //sym.imp.__stack_chk_fail
                                        ; sym.imp.__stack_chk_fail ()
           } else {
           }
      }
      return;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

、、、うん、変換処理はなさそうだな!(アセンブラ読めない)

バイナリ見るときはいつもgdbで見ていたのですが、逆アセンブルする場合、ASCII文字コードを文字に変換することができないっぽい(というかたぶん私が知らないだけ)です。

なんかいい方法ないかなと思って調べていたら、radare2という素敵なツールを見つけました。

# Q22.[Web]Baby's SQLi - Stage 1-

SELECT * FROM palloc_home;
1

# Q28.[Network] Can you login?

pcapファイルが渡されるので、WireSharkで開くと、平文のFTP通信が見えます。

接続先サーバ/ユーザ/パスワードがそのまま見えるので、それを使って実際にftpコマンドでサーバにログインします。

また、passiveモードへ変更している様子も見えることからわかるように、passiveモードでないと接続できないようです。

キャプチャによると、dummyというファイルをアップロードしているようなので、それをgetして中身を見てみると、

FLAG file exists in this directory.

と書いてあるので、ls -laするとドットファイルが見つかります。この中身がフラグ。

# 所感

雰囲気でgdb使っていたので、この機会にradare2ちゃんと覚えたい。

コメント

コメントする

name
content