LoginSignup
4
4

More than 5 years have passed since last update.

picoCTF 2018 write up

Posted at

picoCTF という2週間の CTF のコンテストがあると聞き、今まで CTF のコンテストに出たことがなかったのでやってみた。
簡単なところから始まり、どんどんと解けるので楽しかった。
解けた問題の write up をする。

Forensics Warmup 1

リンクをクリックすると zip ファイルがダウンロードされ、開くと jpg ファイルが出てくる。
それを開くと Flag が書かれた画像が出てくる。

Forensics Warmup 2

リンクをクリックすると png ファイルがダウンロードされ、開くと Forensics Warmup 1 と同じように Flag が出てくる。

General Warmup 1

16進数で 0x41 は ASCII コードだと何かという問題。
0x41 は A

General Warmup 2

27 を2進数で表す問題。
手計算でやってもコードを書いても google 検索でヒットした web ツールを使ってもできる。
答えは 11011

General Warmup 3

16進数の 0x3D を10進数に直す問題。
暗算でやるのが一番早い。答えは 61 になる。

Resources

リンク先のページへ飛ぶと下の方に
Thanks for reading the resources page! Here’s a flag for your time: picoCTF{xiexie_ni_lai_zheli}
とある。

Reversing Warmup 1

picoCTF の shell server 上で移動してコードを実行せよとあるので、とりあえず shell server に行く。
説明欄を読むとログインには自分のアカウントのユーザーIDとパスワードを入れればよさそうなので入れるとログインできる。
問題文中にファイルが置かれているディレクトリが書いてあるので cd コマンドを用いてそこへ移動し、ファイルを実行すると Flag が出てくる。

Reversing Warmup 2

base64 フォーマットの dGg0dF93NHNfczFtcEwz を ASCII にする問題。
google 検索で「Base64 ASCII 変換」などとすればデコードツールが出てくる。

Crypto Warmup 1

キー thisisalilkey と下の変換表を用いて作られた暗号文 llkjmlmpadkkc を復号する問題。

table.txt
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
   +----------------------------------------------------
A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F | F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G | G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H | H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I | I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J | J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K | K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L | L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M | M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N | N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O | O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P | P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q | Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R | R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S | S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T | T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U | U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V | V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W | W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X | X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y

例えば次のようなコードを書いて実行すれば答えが出てくる。

main.cpp
#include <iostream>

int main(){
    std::string key = "thisisalilkey", c = "llkjmlmpadkkc";
    std::string ans(13, ' ');
    int sz = 13;
    for(int i = 0; i < sz; i++){
        ans[i] = ((c[i] - 'a') - (key[i] - 'a') + 26) % 26 + 'a';
    }
    std::cout << ans << std::endl;
}

Crypto Warmup 2

rot13 というもの。google 検索すれば変換サイトはすぐに見つかる。また、自分でコードを書くこともできる。

grep 1

与えられたテキストファイルを開き、何も考えずに Ctrl+F を押して picoCTF と入力すると Flag が見つかる。

net cat

Linux コマンドの nc を使う。
nc 2018shell2.picoctf.com 10854 というコマンドを実行すると Flag が出てくる。

pipe

nc 2018shell2.picoctf.com 48696 とコマンドを打って 2018shell2.picoctf.com 48696 に接続すると何やらメッセージの羅列らしきものが出てきた。
それを読むとフラグを探しているようなので、出てきたメッセージの羅列らしきものに Ctrl+F か何かで picoCTF という文字列を探せば Flag が見つかる。

Inspect Me

リンク先のページにアクセスしてページのソースを見ると Flag の断片が見つかる。
とりあえず css と js に移動するとそれぞれにも Flag の断片があり、これらを繋げると答えになる。

grep 2

まずは shell server に移動する。
複数のファイルに対して grep をしたいが、手動でやると流石に時間がかかりすぎるので Linux コマンドの grep-r のオプション (ディレクトリ内も検索対象とする) をつけて探すと見つかる。

Aca-Shell-A

Linux コマンドの知識を試すゲーム。
次の順番で行えば良い。
1. nc 2018shell2.picoctf.com 33158 に接続する。
2. ( ls でディレクトリを確認して ) cd secret で secret ディレクトリに移動する。
3. 見つけたものを教えてと言われるので、 ls を実行する。
4. intel で始まるファイルを消してと言われるので rm intel* を実行する。
5. echo 'Drop it in!' を実行してと言われるのでその通りにする。
6. executables ディレクトリに行ってファイルを実行してと言われるので、 cd コマンドで移動して、そこにある dontLookHere というファイルを実行する。
7. ユーザー名を画面に出力してと言われるので whoami を実行する。
8. tmp ディレクトリの TopSecret ファイルを passwords ディレクトリにコピーしてと言われるので cd コマンドでホームディレクトリに移動して cp /tmp/TopSecret passwords を実行する。
9. 移動したファイルを読んでと言われるので cd passwords でディレクトリへ移動して cat TopSecret でファイルの中身を出力する。
10. Flag が出てくる。

Client Side is Still Bad

リンク先の web ページのソースを見ると下のような繋げて読めば良さそうな複数の文字列が出てくるので繋げて picoCTF{client_is_bad_9117e9} とすればよい。

main.js
if (checkpass.substring(split*7, split*8) == '}') {
  if (checkpass.substring(split*6, split*7) == '17e9') {
    if (checkpass.substring(split*5, split*6) == 'd_91') {
     if (checkpass.substring(split*4, split*5) == 's_ba') {
      if (checkpass.substring(split*3, split*4) == 'nt_i') {
        if (checkpass.substring(split*2, split*3) == 'clie') {
          if (checkpass.substring(split, split*2) == 'CTF{') {
            if (checkpass.substring(0,split) == 'pico') {
              alert("You got the flag!")
              }
            }
          }

        }
      }
    }
  }
}

Desrouleaux

nc 2018shell2.picoctf.com 54782 に接続し、与えられた json ファイルを見ながら問いに答えよう。問いは難しくない。

caesar cipher 1

Crypto Warmup 2 と同じように google 検索で探すか自分でコードを書くかすれば良い。

environ

まずは shell server に移動する。
printenv コマンドで環境変数の一覧を表示すると、 SECRET_FLAG=picoCTF{eNv1r0nM3nT_v4r14Bl3_fL4g_3758492} というのが出てくる。

blaise's cipher

ヴィジュネル暗号
nc 2018shell2.picoctf.com 18981 に接続すると暗号文が出てくる。
pohzCZK{g1gt3w3_n1pn3wd_ax3s7_maj_095glcih} という部分がそれっぽいので pohzCZKpicoCTF だったと推測ができる。
すると、この部分の鍵は agflagf なので、この暗号文全体の鍵は flag だと予想ができ、google にあるデコードツールでデコードしてみると全体が正しい英語の文になっていることが確認できる。

now you don't

与えられた画像を開くと一見何もないようだが、塗りつぶしをすると文字が浮き上がってくる。

what base is this?

2進数、16進数、8進数をそれぞれASCIIに直すだけ、制限時間は30秒。コードを書くか google 検索でツールを探すかして短い時間で変換できるようにしておこう。

you can't see me

まずは shell server に移動する。
目的のディレクトリに移動して ls を実行しても何も出力されないのでファイルはないように見えるが、ドットファイルがある。ls -l とすればドットファイルがあることが確認できる。
そんなことは全く気にせずに grep picoCTF -r を実行すれば Flag が出てくる。

Safe RSA

RSA暗号 は $m$ (平文) の $e$ (今回は3) 乗が $n$ 以下のときは、平文が暗号文 $c$ の $e$ 乗根になる。
多倍長整数が扱えるプログラミング言語を使えると便利。

rsa-madlibs

RSA暗号の問題をひたすら解いていく。
問題は固定なので、ここ に書いてある内容を参照しながらゆっくり解けば良い。
多倍長整数が扱えるプログラミング言語を使えると便利。
私は Python を用いて、拡張ユークリッドの互除法を用いてモジュラ逆数を求めたり、繰り返し二乗法を使ったりして解いた。

store

コスト 1000 の旗を 3000000 個買うと支払い金額がオーバーフローして負の値になり、所持金が大きく増える。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4