はじめに
3/13から3/27にかけて開催されたpicoCTFのwriteupを私が解けた範囲で書いていきたいと思います.
問題の順番は分野ごとに分けておらず私が解いた順になってます.すみません...
SuperSSH
これはSSHコマンドが使えるかを確認するための問題ですかね.
ssh -p 55352 ctf-player@titan.picoctf.net
このコマンドでサーバに接続すればそのままFlagが入手できます.
Commeitment issues
challenge.zip
という圧縮ファイルが配布されます.
とりあえず解凍します.
unzip challenge.zip
ファイルの中身を見てみるとgit
ファイルがあるようです.
message.txt
にはTOPSECRETという文字があるだけでそれ以外は何もありません.
とりあえずgitのログを見てみます.
.git/logs/HEAD
を見てみると
この時の状態に戻したいのでcheckoutします.
git checkout 6603cb4ff0c4ea293798c03a32e0d78d5ab12ca2
するとmessage.txt
が復元できて中にFlagが入っています.
Bookmarklet
こういうサイトに繋がります.
ここに表示されているjavascriptsを開発者ツールのコンソールに入力すればOKです.
*この時allow pasting
としないとペーストできないので注意してください.
interencdec
enc_flagというファイルが配布される.
中身はbase64っぽいですね.
echo 'YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclgyeG9OakJzTURCcGZRPT0nCg==' | base64 -d
とするとwpjvJAM{jhlzhy_k3jy9wa3k_lh60l00i}
が得られます.これはシフト暗号ですかね?
とりあえず全通りのカギで試してみます.
TimeMachine
challenge.zip
というファイルが配布されます.
タイトルがTimemachineだったのでログを見る系かなと思い,git log
で見てみたところありました.
WebDecode
HomeやAbout,CONTACTなどクリックしても特に何もありません.ページのソースを見てみます.
cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9
の部分が怪しいですね.
base64でデコードしたらいけました.
echo 'cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfMWY4MzI2MTV9' | base64 -d
Scan Surprise
とりあえずsshでログインします.
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というディレクトリがあります.
#!/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
というファイルが配布されます.
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は手も足も出ない状況なのでこれから少しずつできたらなと思います.
ありがとうございました.