BMS, Movie, Illustrations, Programming

競プロとCTFの体験会 #CPCTF write up その1

はじめに

先日2017年4月19日に開催された、traP主催の競プロとCTFの体験会(#CPCTF)にオンライン参加しました。4人のチームで32個のフラグを取り、無事5位を取ることができました。

他のCTFと比べて初心者向けの問題が多く、また、競プロの問題もあったため、CTF初心者やCTF未経験者でも楽しく参加することができたように思います。また、問題数が多く(59問)、難しい問題もあったため、CTF上級者でも楽しめたのではないでしょうか。

公式ではwrite upは公開されないようなので、参加記念を兼ねて、write upを書いておきたいと思います。長くなりそうなので、(次回があるかどうかは分かりませんが)その1では、時間内に解けた問題について見ていきたいと思います。覚えている範囲ですが、解いた人も記載しておきます。

Welcome

ヒントをすべて見るとフラグが入手できます。フラグは FLAG{Welcome_to_youkoso_traP} でした。ちなみに、ヒントを見ずに正解すると10000ptsがもらえますが、不正なので削除されるそうです。

You are Postman!

解いた人: yuinore

指定されたURLを開くと、Please Post!と表示されるので、その通りに、http://newbie.ctf-no.pro/postman にPOSTリクエストを送ります。すると、

mint@ubuntu:~$ wget --post-data "mazesoba" http://newbie.ctf-no.pro/postman
--2017-04-19 22:06:32--  http://newbie.ctf-no.pro/postman
newbie.ctf-no.pro (newbie.ctf-no.pro) をDNSに問いあわせています... 133.130.100.147
newbie.ctf-no.pro (newbie.ctf-no.pro)|133.130.100.147|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 18 [text/html]
`postman' に保存中

postman             100%[===================>]      18  --.-KB/s    in 0s      

2017-04-19 22:06:32 (1.44 MB/s) - `postman' へ保存完了 [18/18]

mint@ubuntu:~$ cat postman 
FLAG{HTTP_METHODS}

となり、フラグ FLAG{HTTP_METHODS} が入手できました。

隠されたフラグ

解いた人: わに

HTMLのソースコードを開くとフラグが書いてあります。フラグは FLAG{TAIWAN_MAZESOBA} でした。

隠されたフラグ2

解いた人: わに

「こころへ行けばフラグをもらえるみたい」と書いてあるので、こころへ行きたいのですが、こころが選択肢にありません。ソースコードを見ると、

麺屋こころ大岡山店行ってね!!!!<br>
<a href="/ryoga.txt">凌駕</a><br>
<a href="/kajiken.txt">歌志軒</a><br>
<a href="/shisen.txt">四川</a><br>
<a href="/yabu.txt">やぶそば</a><br>
<a href="/mac.txt">マクドナルド</a><br>

と書いてあるので、ここから推測して、アドレスバーに cocoro.txt と入力するとフラグが入手できます。フラグは FLAG{NIKUIRI_TIWAN_MAZESOBA} でした。

頭に注意

解いた人: yuinore

問題のURLが http://newbie.ctf-no.pro/watch_head となっています。ということなので、HTTPヘッダを見るのではないかと思います。wgetでヘッダを見るオプションは -S です。

mint@ubuntu:~$ wget http://newbie.ctf-no.pro/watch_head -S
--2017-04-19 22:30:24--  http://newbie.ctf-no.pro/watch_head
newbie.ctf-no.pro (newbie.ctf-no.pro) をDNSに問いあわせています... 133.130.100.147
newbie.ctf-no.pro (newbie.ctf-no.pro)|133.130.100.147|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 
  HTTP/1.1 200 OK
  Server: openresty
  Date: Thu, 20 Apr 2017 05:30:24 GMT
  Content-Type: text/html; charset=utf-8
  Content-Length: 16
  Connection: keep-alive
  X-Powered-By: Express
  FLAG: FLAG{SHIO_MAZESOBA}
  ETag: W/"10-dK8J1SCmbESiaZva+R526doa8FI"
長さ: 16 [text/html]
`watch_head' に保存中

watch_head          100%[===================>]      16  --.-KB/s    in 0s      

2017-04-19 22:30:24 (2.67 MB/s) - `watch_head' へ保存完了 [16/16]

mint@ubuntu:~$

無事、フラグ FLAG{SHIO_MAZESOBA} が入手できました。

たらい回し

解いた人: わに

指定されたURLを開くと、なぜか麺屋こころのページに飛ばされてしまいます。ということで、 http://bit.ly/trap-ctf-waffling が怪しそうなので、このページを保存します。ソースコードを見ると、

<script>window.location='https://www.menya-cocoro.com'</script>

となっていて、フラグが見つからない・・・と見せかけて、ファイル名がフラグになっています。フラグは FLAG{MENYA_COCORO_HA_GREAT_OKAYAMA_NI_HONTEN_ARI} でした。

工事中

解いた人: yuinore

ヒント1を見ると、「あるところをdebug=trueにする」と書いてあったので、http://newbie.ctf-no.pro/under_construction?debug=true にアクセスするとフラグが入手できます。フラグは FLAG{HACHIOKU} でした。これは割と終了時間ギリギリにヒントを見て解きました。

ちなみに、競技時間の最初の方で、wget http://newbie.ctf-no.pro/under_construction --post-data="debug=true" ってやったんですけれど404 Not Foundになってダメでした。POSTメソッドだとダメみたいです。

mint@ubuntu:~$ wget http://newbie.ctf-no.pro/under_construction --post-data="debug=true"
--2017-04-19 22:51:01--  http://newbie.ctf-no.pro/under_construction
newbie.ctf-no.pro (newbie.ctf-no.pro) をDNSに問いあわせています... 133.130.100.147
newbie.ctf-no.pro (newbie.ctf-no.pro)|133.130.100.147|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2017-04-19 22:51:01 エラー 404: Not Found。

隠されたフラグ3

解いた人: わに

ソースコードを見ると.jsを読み込んでいるので、その.jsの中を見ると、フラグ FLAG{Javascript_is_god} が入手できます。

HowToPPC

解いた人: hihumi, わに

競技プログラミング問題の解き方を解説した問題です。与えられたプログラムを実行して提出すればOKです。環境によっては、標準入力と標準出力をファイルから読み書きするのが難しかったかもしれません。自分は普段はC#で書いていて、IDEにVisual Studioを使用していたので、プロジェクト設定から、デバッグ時のオプションのコマンドライン引数の部分に、< C:\mint\input.txt > C:\mint\output.txt と入力していました。・・・が、今回はC++のコードが掲載されていたので、Linuxで実行しました。

mint@ubuntu:~$ vim main.cpp
mint@ubuntu:~$ g++ main.cpp 
mint@ubuntu:~$ ./a.out < input.txt > output.txt
mint@ubuntu:~$ less output.txt 

フラグは FLAG{YouArePro_YouAreTouristOfNewbieWorld} でした。

cat

解いた人: わに

ssh nyan@cat.ctf-no.pro password: nyan

と書いてあったので、これをそのままコマンドラインに入力すればフラグが入手できる・・・と思っていたのですが、

mint@ubuntu:~$ ssh nyan@cat.ctf-no.pro password: nyan
nyan@cat.ctf-no.pro's password: 
the input device is not a TTY

と怒られてしまい、接続できませんでした。後で気付いたのですが、sshコマンドの書式が間違っていたらしく、password以降は必要ないらしいです。(←その場で気付け)

mint@ubuntu:~$ ssh nyan@cat.ctf-no.pro
nyan@cat.ctf-no.pro's password: 
[nyan@e75095a4f33e ~]$ ls
flag.txt
[nyan@e75095a4f33e ~]$ cat flag.txt 
FLAG{c@t_flag}

この問題は、本番ではわにさんにWindowsで解いてもらいました。

netcat

解いた人: yuinore

「フラグはctf-no.pro 3335で受け取れます。」と書いてあるので、http://ctf-no.pro:3335 にchromeでアクセス・・・しようとすると、https のページに飛ばされてしまい、ERR_SSL_PROTOCOL_ERROR が出てしまいます。なので、Linuxから、 wget http://ctf-no.pro:3335/ を実行すると、

mint@ubuntu:~$ wget http://ctf-no.pro:3335/
--2017-04-19 23:21:16--  http://ctf-no.pro:3335/
ctf-no.pro (ctf-no.pro) をDNSに問いあわせています... 133.130.100.147
ctf-no.pro (ctf-no.pro)|133.130.100.147|:3335 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 ヘッダがないので、HTTP/0.9 だと仮定します
長さ: 特定できません
`index.html' に保存中

index.html              [ <=>                ]      19  --.-KB/s    in 0s      

2017-04-19 23:21:16 (2.06 MB/s) - `index.html' へ保存終了 [19]

mint@ubuntu:~$ cat index.html 
FLAG{s0ck37M@573r}

となり、フラグ FLAG{s0ck37M@573r} を入手できます。自分は使わなかったのですが、想定解としては、nc (netcat) コマンドを使うのかなと思います。

mint@ubuntu:~$ nc ctf-no.pro 3335
FLAG{s0ck37M@573r}

ちなみに、Internet Explorer 及び Edge では http://ctf-no.pro:3335/ にアクセスしてフラグを入手することができました。Windows環境なら、これが一番早いと思います。

DirtyText

解いた人: yuinore

ページを開くと

」ニ」フ」チ」ヌ。ミ」ヤ」陬鬟イ」鬟イ」ナ」ユ」テ。イ」ハ」ミ。ム 


「ィチエ、ニ、ホハクサ妤セウム、ヒ、キ、ニ、ヘ。ェ

となり、恐らく文字コードが間違っていると思われるので、chromeの設定からエンコードを変更・・・したいのですが、chromeではエンコーディングの設定は消えてしまったみたいです。なので再度Internet Explorerくんに登場してもらい、エンコード → 日本語(自動選択) を選ぶと、

FLAG{This_is_EUC_JP} 


※全ての文字を半角にしてね!

となり、フラグ FLAG{This_is_EUC_JP} が入手できます。ファイルをダウンロードしてからごにょごにょしてもいいと思います。

search

解いた人: わに

ファイルが多いのでgrepで解きます。

mint@ubuntu:~$ ssh search@ctf-no.pro
search@ctf-no.pro's password: 
[search@a52637be469c ~]$ grep FLAG *
810.txt:FLAG{it5_e@sy_t0_se@rch}

勘で解いた人も居たようです。

dotfile

解いた人: わに

Linuxではピリオド(ドット)で始まるファイルは隠しファイルになります。ls -alで、隠しファイルを含めて詳細に表示することができます。

mint@ubuntu:~$ ssh dotfile@ctf-no.pro
dotfile@ctf-no.pro's password: 
[dotfile@f1d34a2ec34a ~]$ ls
readme
[dotfile@f1d34a2ec34a ~]$ cat readme 
There is a hidden file in this directory.
[dotfile@f1d34a2ec34a ~]$ ls -al
total 28
drwx------ 1 dotfile dotfile 4096 Apr 19 04:07 .
drwxr-xr-x 1 root    root    4096 Apr 19 04:07 ..
-rw-r--r-- 1 dotfile dotfile   21 Feb 14 22:16 .bash_logout
-rw-r--r-- 1 dotfile dotfile   57 Feb 14 22:16 .bash_profile
-rw-r--r-- 1 dotfile dotfile  141 Feb 14 22:16 .bashrc
-rw-r--r-- 1 dotfile dotfile   20 Apr 19 04:07 .flag.txt
-rwxrwxrwx 1 dotfile dotfile   42 Apr 19 04:07 readme
[dotfile@f1d34a2ec34a ~]$ cat .flag.txt 
FLAG{c@n_y0u_re@d?}

executable

解いた人: わに, yuinore

とりあえずssh接続します。

mint@ubuntu:~$ ssh executable@ctf-no.pro
executable@ctf-no.pro's password: 
[executable@ff79b05c68af ~]$ ls
executable
[executable@ff79b05c68af ~]$ ./executable 
I hid the secret in this file

バイナリファイルの中にフラグが隠されているようです。

[executable@ff79b05c68af ~]$ grep FLAG executable 
grep: executable: Permission denied

許可がないので許可を与えましょう。chmodでパーミッションを設定します。

[executable@ff79b05c68af ~]$ chmod 777 executable 
[executable@ff79b05c68af ~]$ grep FLAG executable 
Binary file executable matches

バイナリファイルはgrepでは検索させてくれないようです。なので、odコマンドで確認します。

[executable@ff79b05c68af ~]$ od -c executable | head
0000000 177   E   L   F 001 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020 002  \0 003  \0 001  \0  \0  \0 020 203 004  \b   4  \0  \0  \0
0000040   | 027  \0  \0  \0  \0  \0  \0   4  \0      \0  \t  \0   (  \0
0000060 037  \0 036  \0 006  \0  \0  \0   4  \0  \0  \0   4 200 004  \b
0000100   4 200 004  \b     001  \0  \0     001  \0  \0 005  \0  \0  \0
0000120 004  \0  \0  \0 003  \0  \0  \0   T 001  \0  \0   T 201 004  \b
0000140   T 201 004  \b 023  \0  \0  \0 023  \0  \0  \0 004  \0  \0  \0
0000160 001  \0  \0  \0 001  \0  \0  \0  \0  \0  \0  \0  \0 200 004  \b
0000200  \0 200 004  \b 020 006  \0  \0 020 006  \0  \0 005  \0  \0  \0
0000220  \0 020  \0  \0 001  \0  \0  \0  \b 017  \0  \0  \b 237 004  \b
[executable@ff79b05c68af ~]$ od -c executable | grep F
0000000 177   E   L   F 001 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0002300   F   L   A   G   {   i   7   _   5   h   0   u   1   d   _   n
0002520 200 375 377 377   0  \0  \0  \0  \0 016  \b   F 016  \f   J 017
0012460   u   t   a   b   l   e   .   c  \0   _   _   F   R   A   M   E
0012600   _   _   G   N   U   _   E   H   _   F   R   A   M   E   _   H
0012620   D   R  \0   _   G   L   O   B   A   L   _   O   F   F   S   E

2300バイト目にフラグっぽいものがあります。

[executable@ff79b05c68af ~]$ od -c executable | grep 0002300
0002300   F   L   A   G   {   i   7   _   5   h   0   u   1   d   _   n
[executable@ff79b05c68af ~]$ od -c executable | grep 0002310
[executable@ff79b05c68af ~]$ od -c executable | grep 0002320
0002320   0   t   _   6   3   _   r   3   @   d   }  \0   I       h   i
[executable@ff79b05c68af ~]$ 

フラグ FLAG{i7_5h0u1d_n0t_63_r3@d} が入手できました。

後から知ったのですが、stringsコマンドを使うともっと簡単にフラグが入手できるようです。

[executable@53583613f6e7 ~]$ strings executable | grep FLAG
FLAG{i7_5h0u1d_n0t_63_r3@d}

学籍番号

解いた人: yuinore

じゃすとどぅーいっと。フラグは FLAG{Ch3ck_D1g1t_is_good} でした。

#pragma warning disable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

public class Test
{
    public static void Main()
    {
        int N = Int32.Parse(Console.ReadLine());

        for (int i = 0; i < N; i++)
        {
            string line = Console.ReadLine();

            int i1 = line[0] - '0';
            int i2 = line[1] - '0';
            int i3 = line[3] - '0';
            int i4 = line[4] - '0';
            int i5 = line[5] - '0';
            int i6 = line[6] - '0';
            int i7 = line[7] - '0';

            if ((i1 * 2 + i2 * 3 + i3 * 4 + i4 * 5 + i5 * 6 + i6 * 7) % 11 % 10 == i7)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("NO");
            }
        }

    }
}

は?

解いた人: hihumi, わに

文字列の末尾が ? かどうかを判定します。フラグは FLAG{4ckn0wl3dg3m3n7_s1gn4L} でした。フラグ確認のために自分が今書いたコードも掲載しておきます。

#pragma warning disable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

public class Test
{
    public static void Main()
    {
        int N = Int32.Parse(Console.ReadLine());

        for (int i = 0; i < N; i++)
        {
            string line = Console.ReadLine();
            
            if (line.Last() == '?')
            {
                Console.WriteLine("hai");
            }
            else
            {
                Console.WriteLine("ha?");
            }
        }

    }
}

カフェインファイター1

解いた人: わに, yuinore

疲労度の大きい順にソートし、最初のM個の中でCより大きいものをCとして総和を取ります。フラグは FLAG{syaro_fights_with_caffeine}でした。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace カフェインファイター1
{
    class Program
    {
        static void Main(string[] args)
        {
            var line1 = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
            var N = line1[0];
            var M = line1[1];
            var C = line1[2];

            var a = Console.ReadLine().Split(' ')
                .Select(x => long.Parse(x))
                .OrderByDescending(x => x).ToArray();

            for (int i = 0; i < M; i++)
            {
                a[i] = Math.Min(a[i], C);
            }

            Console.WriteLine(a.Sum());
        }
    }
}

最初、わにさんに解いてもらっていたのですが、なぜかWrong Answerとなってしまっていました。コンテスト終了後に調べたところ、ソート処理を文字列の状態で行っていたため、Wrong Answerとなっていたようです。文字列比較には気をつけよう!

PasswordCracking 1

解いた人: hihumi, yuinore

HTMLのソースコードに

if(inp.value === 32895921012848){
	location.href = inp.value + ".html";

というのがあるので、フォームに 32895921012848 を入力すれば通る・・・と思いきや、通りません。これは、比較を === で行っているためで、左辺が文字列型、右辺が数値型となり、異なる型と判定されるためです。ですが、その次の行にジャンプ先のURLが書いてあるので、アドレスバーに 32895921012848.html と入力すれば、フラグ FLAG{g00d_w0rk} が入手できます。

PasswordCracking 2

解いた人: hihumi, yuinore

14行目の ===== に書き換えれば解ける・・・と思いきや通りません。ですが、14行目を if(true){ に書き換えると通ります。フラグは FLAG{3m0t1con_lo0ks_funny} でした。難読化されたコードを読む気はありませんが、誰か読んでみてください。

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

PasswordCracking 3

解いた人: hihumi

パスワードはdottanbattanなので、これを入力すれば通る・・・と思いきや、10文字しかフォームに入力できません。これは、inputに maxlength="10" が指定されているからなので、ファイルをローカルに保存して、ここの数字を大きくすればOKです。フラグは FLAG{maxlength_is_no_meaning?} でした。

PasswordCracking 5

解いた人: yuinore

DB試験の勉強を頑張ったので、SQL問題が来て少しテンションが上がった問題です。よくあるSQLインジェクションの問題です。phpを見ると、WHERE句でヒットする行が1行以上になるとフラグが表示されるようになっています。ここで、フォームに、mazesoba' OR 'A' = 'Aのように入力すると、サーバ側では次のように展開されます。

$cnt = $db->query("SELECT COUNT(*) FROM User WHERE Password = 'mazesoba' OR 'A' = 'A'")->fetchColumn();

これによって、WHEREの中が常に真となり、フラグ FLAG{books.narusejun.com_sqli_no_hon_kattene} を取ることができました。SQL injectionの本買いました、よろしくお願いします。

selfie

終了ギリギリにヒントを見て解いた問題です。本当にギリギリだったので、部室が盛り上がったりしました。URL の f=??? の部分がファイル名になっているようなので、自分自身のファイル名である source を指定すれば自分自身のソースコードを見ることができます。 http://passwordcracking.ctf-no.pro/source.php?f=source にアクセスすると、

/* wow! ur sharp-sighted... FLAG for 'selfie' is fLAG{tHou_shAlt_noT_touCh_It} (make 'f' capital) */

となり、フラグ FLAG{tHou_shAlt_noT_touCh_It} が入手できます。最初のfを大文字にするのを忘れないように。

フェネックやめるのだ

解いた人: yuinore

フェネックを0に、やめるのだを1に置き換えると、asciiコードと思われるものになります。これをバイナリにすると、フラグが入手できます。恐らくasciiコードだろう、と考えると、(アスキーコードは 0~127 の範囲に収まるので)フェネックが0で、やめるのだが1になるということがわかります。

mint@ubuntu:~$ cat call.txt | sed s/フェネック/0/g | sed s/やめるのだ/1/g | fold -b8
01000110
01001100
01000001
01000111
01111011
01101101
00110100
00110111
01100001
01111001
01100001
01110100
01110100
00110011
00110101
01101000
00110001
01101101
01100001
00110111
00110111
01100001
01101110
00110011
01100101
01111101

自分は次のようなコードを組んで、フラグ FLAG{m47ayatt35h1ma77an3e} を取りました。

#pragma warning disable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

public class Test
{
    public static void Main()
    {
        string s = "01000110...(中略)...01111101";

        for (int i = 0; i < s.Length; i += 8)
        {
            Console.Write((char)(
                ((s[i + 0] - '0') << 7) +
                ((s[i + 1] - '0') << 6) +
                ((s[i + 2] - '0') << 5) +
                ((s[i + 3] - '0') << 4) +
                ((s[i + 4] - '0') << 3) +
                ((s[i + 5] - '0') << 2) +
                ((s[i + 6] - '0') << 1) +
                ((s[i + 7] - '0') << 0)
                ));
        }

    }
}

オンサイトでのwrite upでは、Binary to Ascii Text Converter (うろ覚え)といったようなサービスを使って解いていました。

Additiveness

問題文にあるコマンドを叩くと、何かが起きます。

mint@ubuntu:~$ nc Additiveness.ctf-no.pro 54930
ASDF
DVHW

ソースコードを見ると、各文字に乱数を加えているようです。しかし、この乱数のシードが定数なので、生成される乱数列は毎回同じものとなります。従って、乱数列が求められますので、問題文にある謎の文字列から乱数列を引き算すれば元のフラグも計算できることになります。フラグは FLAG{EXTRACT_INFO_FROM_AN_ORACLE} となります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var s1 = "IOEX{DTBCCES_LODL_YHWV_EA_IGKAPJ}";
        var s2 = "LRIO{CPJNEGR_OPBI_RXEE_IN_CVUYTO}";  // s1 を nc コマンドで送った結果

        for (int i = 0; i < s1.Length; i++)
        {
            if ('A' <= s1[i] && s1[i] <= 'Z')
            {
                int random_number = ((int)s2[i] - (int)s1[i] + 26) % 26;

                int x = (((int)s1[i] - (int)'A') - random_number + 26) % 26;

                Console.Write((char)(x + 'A'));
            }
            else
            {
                Console.Write(s1[i]);
            }
        }

        Console.WriteLine();  // 改行

        // FLAG{EXTRACT_INFO_FROM_AN_ORACLE}
    }
}

Sobaphore

解いた人: yuinore

Youtubeの動画が貼り付けられています。動画の中盤から、突然†謎の人物†が現れて、旗を振り始めます。これは、Flag semaphore というもので、日本語では手旗信号と言われます。

Wikipedia に書いてあるとおりに解読すると、

JSOBE[Cancel]AYA[Numerials]KKG

となり、正しい文章となりません。ここで、Wikipediaをちゃんと読むと、信号の最初には、[Letters] または [Numerials] という信号を付けることと書いてあります。また、[Cancel] 信号は1文字訂正する信号なので、

[Letters]SOBAYA[Numerials]007

となり、フラグ FLAG{SOBAYA007} が入手できます。

話によると、この動画を撮影するときに、何度もリテイクを食らったそうです。お疲れ様でした。 (_ _)

ちなみに、最初「旗振り通信」で検索していたのですが、それらしいものが出てこなかったので余計な時間を使ってしまいました。

strings

解いた人: わに, yuinore

このファイルをLinuxで実行しても何も表示されません。odでファイルの中を見てみます。

mint@ubuntu:~$ od easy_string -c | grep F
0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0002640 001  \0 002  \0   F   L   A   G   {   w   3   1   c   0   m   3
0003100 240 375 377 377      \0  \0  \0  \0 016 020   F 016 030   J 017
0003220  \0   A 016 020 206 002   C  \r 006   F  \f  \a  \b  \0  \0  \0
0013460   t   r   y  \0   s   t   r   i   n   g   .   c  \0   _   _   F
0013600   a   r   t  \0   _   _   G   N   U   _   E   H   _   F   R   A
0013640   F   F   S   E   T   _   T   A   B   L   E   _  \0   _   _   l
0014020  \0   _   _   d   s   o   _   h   a   n   d   l   e  \0   F   L

何かありそうです。stringsというコマンドを使うといい感じのことが出来るそうです。

mint@ubuntu:~$ strings easy_string | grep FLAG
FLAG{w31c0m3}
FLAG

フラグが入手できました。

RGB

解いた人: hihumi

画像の真ん中の部分が怪しいです。お絵描きソフトを開いて、適当な部分を塗りつぶすと、フラグが出てきます。

フラグ FLAG{thr33_lay3rs} を入手できました。

チラシの裏

解いた人: Azel

東工大の†プロ†であるAzelさんが、写真を見て場所を推定して、走ってフラグを見に行ってきてくれました。フラグは忘れました。

チラ裏が解かれて、一部の人が盛り上がったようです。

ちなみに、想定解法としては写真に埋め込まれているEXIF情報を用いるというものでした。気付きませんでした。

また、あまりにも変な場所に貼りすぎて、大会前に拡散されてしまったようです。

Continue

解いた人: Azel, yuinore

数字が画面に延々と表示されます。とても不気味です。さて、これがなんの数字なのか全く検討も付かなかったのですが、 Azel さんの素晴らしい数学力により、これは

\[ \frac{4}{3} ( \sqrt{2} – 1 ) \]

であると教えてくれました。ということなので、Wolfram Alphaさんに聞くと、

と教えてくれるので、フラグは FLAG{4671833791035220} かな・・・と思ったら、文字数が合いません。これはどういうことかというと、各文字が次のように対応しているのでした。

...142718FLAG{**********}969800...
...1427184671833791035220969800...

ということで、フラグは FLAG{3379103522} となります。

ところで、この問題の想定解法を聞くのを忘れてしまったのですが、どうだったのでしょうか。一応、552284749830793398402 あたりで検索するとヒットするみたいです。楕円曲線の何からしいのですが・・・。


4/27 追記:

とのことでした。

Wolfram Alpha さんかしこい!

TimeMachine

以前は http://ctf-no.pro/ にフラグがあったそうです。ということでwebarchiveさんに聞いてみると、

Welcome to yokoso the very beginning of our website!

FLAG{He1lo_fr0m_m4rCh}

と教えてくれるので、フラグが FLAG{He1lo_fr0m_m4rCh} であることがわかりました。これが想定解法なのではないかとのことです。

Twitter is fun !

解いた人: yuinore

Twitter検索で、FLAG from:N4RU5E を検索すればOKです。

今見返してみたら、過去の自分がこのツイートをRTしてました。

おわりに

アンケート

よろしければどうぞ。