picoCTF 2024：writeup

# はじめに
3/13から3/27にかけて開催されたpicoCTFのwriteupを私が解けた範囲で書いていきたいと思います．
問題の順番は分野ごとに分けておらず私が解いた順になってます．すみません...

# SuperSSH
これはSSHコマンドが使えるかを確認するための問題ですかね．
`ssh -p 55352 ctf-player@titan.picoctf.net`
このコマンドでサーバに接続すればそのままFlagが入手できます．
![Pasted image 20240314113013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/e5264ec3-f446-00a9-491a-38a2d73b5215.png)

# Commeitment issues
`challenge.zip`という圧縮ファイルが配布されます．
とりあえず解凍します．
`unzip challenge.zip`
ファイルの中身を見てみると`git`ファイルがあるようです．
![Pasted image 20240314113434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/c376d3e2-384f-2513-b1e7-d7ee0441a364.png)
`message.txt`にはTOPSECRETという文字があるだけでそれ以外は何もありません．

とりあえずgitのログを見てみます．
`.git/logs/HEAD`を見てみると
![Pasted image 20240314130031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/1ca40372-5de5-25ea-36ad-b3aaaf476043.png)
この時の状態に戻したいのでcheckoutします．
`git checkout 6603cb4ff0c4ea293798c03a32e0d78d5ab12ca2`
すると`message.txt`が復元できて中にFlagが入っています．

# Bookmarklet
![Pasted image 20240314130300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/503a1d21-16ef-03cb-45d3-bbdc1dd8fc28.png)
こういうサイトに繋がります．
ここに表示されているjavascriptsを開発者ツールのコンソールに入力すればOKです．
![Pasted image 20240314131624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/53b1dc62-72d2-9b3b-373d-d2a15cb5d1b1.png)
＊この時`allow pasting`としないとペーストできないので注意してください．

# interencdec
enc_flagというファイルが配布される．
中身はbase64っぽいですね．
`echo 'YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclgyeG9OakJzTURCcGZRPT0nCg==' | base64 -d`
とすると`wpjvJAM{jhlzhy_k3jy9wa3k_lh60l00i}`が得られます．これはシフト暗号ですかね？
とりあえず全通りのカギで試してみます．
![Pasted image 20240314134909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/e752d28d-9966-4900-7ada-bdb02b8bac20.png)

# TimeMachine
`challenge.zip`というファイルが配布されます．
タイトルがTimemachineだったのでログを見る系かなと思い，`git log`で見てみたところありました．
![スクリーンショット 2024-03-29 230155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/ead799a4-7b86-9df5-119a-941c94c625e7.png)

# WebDecode
![Pasted image 20240314184504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/48133007-5516-aa17-c1b3-abd24a4edc8e.png)
HomeやAbout，CONTACTなどクリックしても特に何もありません．ページのソースを見てみます．
![Pasted image 20240314184823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/f47fd486-caa4-87b0-ceb2-ae692894048c.png)
`cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9`の部分が怪しいですね．
base64でデコードしたらいけました．
`echo 'cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9' | base64 -d`

# Scan Surprise
とりあえずsshでログインします．
![Pasted image 20240314185213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/d3db246f-b877-c002-e841-08353c4656b3.png)
QRコードが得られるのでこのQRを読み込んだらFlagが得られます．

# format-string-0
題名的に書式指定文字列攻撃ですかね(あまり詳しくありませんが…)？
取り合えず`flag.txt`というファイルがないとエラーを吐くので，作成します．

```
char *menu1[3] = {"Breakf@st_Burger", "Gr%114d_Cheese", "Bac0n_D3luxe"};
    if (!on_menu(choice1, menu1, 3)) {
        printf("%s", "There is no such burger yet!\n");
        fflush(stdout);
    } else {
        int count = printf(choice1);
        if (count > 2 * BUFSIZE) {
            serve_bob();
        } else {
            printf("%s\n%s\n",
                    "Patrick is still hungry!",
                    "Try to serve him something of larger size!");
            fflush(stdout);
        }
    }
```
書式指定文字列攻撃と推測して`Breakf@st_Burger`, `Gr%114d_Cheese`, `Bac0n_D3luxe`の中で書式指定子`%`が含まれているものを選択してみます．なので`Gr%114d_Cheese`を選択します．次は`Pe%to_Portobello`，`$outhwest_Burger`，`Cla%sic_Che%s%steak`の中から`Cla%sic_Che%s%steak`を選びます．これでFlagが取得できます．

# Verify
challenge.zipが与えられます．
解凍するとchecksum.txtとdecrypt.sh，filesというディレクトリがあります．
```decrypt.sh
#!/bin/bash

        # Check if the user provided a file name as an argument
        if [ $# -eq 0 ]; then
            echo "Expected usage: decrypt.sh <filename>"
            exit 1
        fi

        # Store the provided filename in a variable
        file_name="$1"

        # Check if the provided argument is a file and not a folder
        if [ ! -f "/home/ctf-player/drop-in/$file_name" ]; then
            echo "Error: '$file_name' is not a valid file. Look inside the 'files' folder with 'ls -R'!"
            exit 1
        fi

        # If there's an error reading the file, print an error message
        if ! openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -in "/home/ctf-player/drop-in/$file_name" -k picoCTF; then
            echo "Error: Failed to decrypt '$file_name'. This flag is fake! Keep looking!"
        fi
```
`./files`以下にはテキストファイルがたくさんあります．
sha256sumコマンドを用いて`checksum.txt`と同じ文字列のファイルを探します．
```
cat checksum.txt
467a10447deb3d4e17634cacc2a68ba6c2bb62a6637dad9145ea673bf0be5e02
```
```
sha256sum files/* | grep 467a
467a10447deb3d4e17634cacc2a68ba6c2bb62a6637dad9145ea673bf0be5e02  files/c6c8b911
```
ファイルが見つかりました．

実行環境に応じて適宜，decrypt.shの`/home/ctf-player/drop-in/$file_name`のpathを書き換えて，
`./decrypt.sh files/c6c8b911`でflagが取得できます．

# BlameGame
`unchallenge.zip`が配布されます．
`git log`を見るとかなり多くのログが残っていることがわかります．
なので`git log | grep picoCTF{`の一発でいけます．

# binhex
これはただ出題される問題にこたえていけばいいだけですね．
```
Binary Number 1: 00001100
Binary Number 2: 01010010


Question 1/6:
Operation 1: '|'
Perform the operation on Binary Number 1&2.
Enter the binary result: 01011110
Correct!

Question 2/6:
Operation 2: '<<'
Perform a left shift of Binary Number 1 by 1 bits.
Enter the binary result: 00011000
Correct!

Question 3/6:
Operation 3: '*'
Perform the operation on Binary Number 1&2.
Enter the binary result: 1111011000
Correct!

Question 4/6:
Operation 4: '+'
Perform the operation on Binary Number 1&2.
Enter the binary result: 01011110
Correct!

Question 5/6:
Operation 5: '>>'
Perform a right shift of Binary Number 2 by 1 bits .
Enter the binary result: 00101001
Correct!

Question 6/6:
Operation 6: '&'
Perform the operation on Binary Number 1&2.
Enter the binary result: 00000000
Correct!

Enter the results of the last operation in hexadecimal: 0

Correct answer!
The flag is: picoCTF{***********************************}
```

# Collaborative Development
これもgitの問題ですね．Collaborativeなのでmergeとかですかね．
`git branch`で見てみると
```
  feature/part-1
  feature/part-2
  feature/part-3
* main
```
3つのブランチがあります．それぞれを見ていきます．
```
git checkout feature/part-1
git checkout feature/part-2
git checkout feature/part-3
```
それぞれのブランチにflagの一部分が含まれているのでそれらをつなぎ合わせたら取得できます．

# can_you_see
`ukn_reality.jpg`というファイルが配布されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3015493/98877ad6-571f-3009-84d1-8cff9cf1870c.png)
`attribution URL`の部分をbase64でデコードすればOKです．
`echo 'cGljb0NURntNRTc0RDQ3QV9ISUREM05fZGVjYTA2ZmJ9Cg==' | base64 -d`

# heap0
ここら辺はまだあまり理解が及んでいませんが，取り合えずバッファオーバーフローかなと思い2番を選択して長い文字列を書き込んだのちに4番を選択するとflagがしゅとくできました．
本当はちゃんとソースを読んだ方がいいんですよね…

# secret_of_the_polyglot
flag2of2-final.pdfというファイルが配られます．
`file`コマンドで見てみると元々はpngファイルみたいですね．
pdfファイルに書かれている文字とpngファイルのほうに書かれている文字をつなげればflagになります．
```
flag2of2-final.pdf: PNG image data, 50 x 50, 8-bit/color RGBA, non-interlaced
```

# Unminify
webページのソースを見てみると1行に横長で書かれている部分があるので検索するだけでflagが取得できます．
＊Unminifyとは圧縮されたコードを可読性が高くなるように復号することを指すようです．

# binary search 
SSHで接続して数あてゲームをするだけですね．

# endianness
バイトオーダーを知っているかを問う問題ですね．
```
Welcome to the Endian CTF!
You need to find both the little endian and big endian representations of a word.
If you get both correct, you will receive the flag.
Word: mozxn
Enter the Little Endian representation: 6e787a6f6d
Correct Little Endian representation!
Enter the Big Endian representation: 6d6f7a786e
Correct Big Endian representation!
Congratulations! You found both endian representations correctly!
Your Flag is: picoCTF{*******************************}
```


# 感想
CTFを勉強し始めて出た，最初の大会でした．
git周りの問題が多い印象でしたね．
初心者向けとはいえ今解ける範囲の問題は，解ききれたのではないかなと思います．(IntroToBurpとかBurpsuiteのチュートリアル問題みたいな感じかなと思ったら意外と解けませんでした...)
また，バイナリ解析やpwn，cryptoは手も足も出ない状況なのでこれから少しずつできたらなと思います．

ありがとうございました．