はじめに
先日2017年4月19日に開催された、traP主催の競プロとCTFの体験会(#CPCTF)にオンライン参加しました。4人のチームで32個のフラグを取り、無事5位を取ることができました。
他のCTFと比べて初心者向けの問題が多く、また、競プロの問題もあったため、CTF初心者やCTF未経験者でも楽しく参加することができたように思います。また、問題数が多く(59問)、難しい問題もあったため、CTF上級者でも楽しめたのではないでしょうか。
本日の競プロ/CTF体験会は78人もの方々に参加していただきました!
Write Upも含めてただいまを以て終了となります!お疲れさまでした!!
問題に関して質問などありましたら、TwitterのこのアカウントにDMをしていただければお答えいたします!
ありがとうございました!!— 東工大デジタル創作同好会traP (@traPtitech) 2017年4月19日
公式ではwrite upは公開されないようなので、参加記念を兼ねて、write upを書いておきたいと思います。長くなりそうなので、(次回があるかどうかは分かりませんが)その1では、時間内に解けた問題について見ていきたいと思います。覚えている範囲ですが、解いた人も記載しておきます。
Welcome
ヒントをすべて見るとフラグが入手できます。フラグは FLAG{Welcome_to_youkoso_traP}
でした。ちなみに、ヒントを見ずに正解すると10000ptsがもらえますが、不正なので削除されるそうです。
#CPCTF 10000点は正常プレイじゃないので削除されます
— 成 (@_n_ari) 2017年4月19日
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}
勘で解いた人も居たようです。
今日一番面白かったのはsearchを勘で当てたところ#CPCTF
— ゆい (@highsate) 2017年4月19日
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
画像の真ん中の部分が怪しいです。お絵描きソフトを開いて、適当な部分を塗りつぶすと、フラグが出てきます。
おえかきたいむ #CPCTF
— 東工大アニメ研 CTF部 (@titans_no_pro) 2017年4月19日
フラグ FLAG{thr33_lay3rs}
を入手できました。
チラシの裏
解いた人: Azel
東工大の†プロ†であるAzelさんが、写真を見て場所を推定して、走ってフラグを見に行ってきてくれました。フラグは忘れました。
チラ裏が解かれて、一部の人が盛り上がったようです。
チラ裏解かれてめっっっちゃ嬉しい #CPCTF
— 成瀬順 (@N4RU5E) 2017年4月19日
チラ裏解かれた~~!!!#CPCTF
— とーふとふ@ひとのときを、想う。JT (@to_hutohu) 2017年4月19日
ちなみに、想定解法としては写真に埋め込まれているEXIF情報を用いるというものでした。気付きませんでした。
また、あまりにも変な場所に貼りすぎて、大会前に拡散されてしまったようです。
終わったのネタバラシするんですが、コレ #CPCTF の問題でした!!(開催前日に見つかってしまい焦った)https://t.co/HHs3gk4jz5 https://t.co/jediqYmqd8
— 成瀬順 (@N4RU5E) 2017年4月19日
は……?誰が見るのこれ……? pic.twitter.com/s2r2Giztpx
— K-A-N-V-A-R-A🏧 (@k_a_n_v_a_r_a) 2017年4月18日
Continue
解いた人: Azel, yuinore
数字が画面に延々と表示されます。とても不気味です。さて、これがなんの数字なのか全く検討も付かなかったのですが、 Azel さんの素晴らしい数学力により、これは
\[ \frac{4}{3} ( \sqrt{2} – 1 ) \]
であると教えてくれました。ということなので、Wolfram Alphaさんに聞くと、
と教えてくれるので、フラグは FLAG{4671833791035220} かな・・・と思ったら、文字数が合いません。これはどういうことかというと、各文字が次のように対応しているのでした。
...142718FLAG{**********}969800... ...1427184671833791035220969800...
ということで、フラグは FLAG{3379103522}
となります。
ところで、この問題の想定解法を聞くのを忘れてしまったのですが、どうだったのでしょうか。一応、552284749830793398402 あたりで検索するとヒットするみたいです。楕円曲線の何からしいのですが・・・。
4/27 追記:
ちなみにContinueの想定解法は 0.55228か0.5522847でぐぐる、もしくはそこそこの桁数をwolfram|alphaに投げると値を推測してくるのを使う、でした。あとこの数値はベジェ曲線で円を描きたいときに誤差が最小になる制御点の位置です。 #CPCTF
— 5/22 (@phi16_) 2017年4月20日
とのことでした。
Wolfram Alphaさん かしこい! pic.twitter.com/8fEbrb3PUe
— ゆいのあ(第1展 J-22b) (@yuinore) 2017年4月20日
Wolfram Alpha さんかしこい!
値見てエスパーするのは想定外ですね・・・・・・・
— 5/22 (@phi16_) 2017年4月20日
それはそう
— わに@電電 (@waneeeen) 2017年4月20日
continueは先輩が値見た瞬間に「これ!」って言って4/3*(√2-1)を示した時はほんまか?ってなったけどほんまだったから死ぬほど驚いてた
— hihumi (@titech_Hi2Mi) 2017年4月20日
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です。
FLAG{twitter_tanoshii}
— 成瀬順 (@N4RU5E) 2017年3月21日
今見返してみたら、過去の自分がこのツイートをRTしてました。
おわりに
59問のwrite up、1問10分で書いても10時間掛かる
— めりあしぐ (@meliasig) 2017年4月20日
アンケート
よろしければどうぞ。
#CPCTF アンケートつくりました。回答していただけるとうれしいです><https://t.co/eMR8yq1KDR
— 成瀬順 (@N4RU5E) 2017年4月20日