2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

picoCTF 2024:writeup

Posted at

はじめに

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

SuperSSH

これはSSHコマンドが使えるかを確認するための問題ですかね.
ssh -p 55352 ctf-player@titan.picoctf.net
このコマンドでサーバに接続すればそのままFlagが入手できます.
Pasted image 20240314113013.png

Commeitment issues

challenge.zipという圧縮ファイルが配布されます.
とりあえず解凍します.
unzip challenge.zip
ファイルの中身を見てみるとgitファイルがあるようです.
Pasted image 20240314113434.png
message.txtにはTOPSECRETという文字があるだけでそれ以外は何もありません.

とりあえずgitのログを見てみます.
.git/logs/HEADを見てみると
Pasted image 20240314130031.png
この時の状態に戻したいのでcheckoutします.
git checkout 6603cb4ff0c4ea293798c03a32e0d78d5ab12ca2
するとmessage.txtが復元できて中にFlagが入っています.

Bookmarklet

Pasted image 20240314130300.png
こういうサイトに繋がります.
ここに表示されているjavascriptsを開発者ツールのコンソールに入力すればOKです.
Pasted image 20240314131624.png
*この時allow pastingとしないとペーストできないので注意してください.

interencdec

enc_flagというファイルが配布される.
中身はbase64っぽいですね.
echo 'YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclgyeG9OakJzTURCcGZRPT0nCg==' | base64 -d
とするとwpjvJAM{jhlzhy_k3jy9wa3k_lh60l00i}が得られます.これはシフト暗号ですかね?
とりあえず全通りのカギで試してみます.
Pasted image 20240314134909.png

TimeMachine

challenge.zipというファイルが配布されます.
タイトルがTimemachineだったのでログを見る系かなと思い,git logで見てみたところありました.
スクリーンショット 2024-03-29 230155.png

WebDecode

Pasted image 20240314184504.png
HomeやAbout,CONTACTなどクリックしても特に何もありません.ページのソースを見てみます.
Pasted image 20240314184823.png
cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9の部分が怪しいですね.
base64でデコードしたらいけました.
echo 'cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9' | base64 -d

Scan Surprise

とりあえずsshでログインします.
Pasted image 20240314185213.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_BurgerCla%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
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は手も足も出ない状況なのでこれから少しずつできたらなと思います.

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

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?