zawatech

【CTF入門】picoCTFの入門問題解法メモ

タグ
Capture The FlagCTFpicoCTF
カテゴリ
CTF
Xこの記事をポストする
この記事をLINEでシェア

CTFを全く触ったことがない主が1から問題を解いていったメモです。

picoCTFという問題サイトの、picoGymという括り?(AtCoderでいう AtCoder Beginners Selection みたいなものだと思います)の問題を取り扱っています。

picoCTFは登録すれば無料かつ常設でCTFの問題が解けるサイトです。

1. Verify

https://play.picoctf.org/practice/challenge/450

(Description)
模造フラッグで選手を騙そうとする人が後を絶たない。 私は彼らが本物を手にすることを確認したい! SHA-256ハッシュと復号化スクリプトを提供し、私のフラグが正当なものであることを確認できるようにするつもりだ。 その他の詳細は、チャレンジ・インスタンスを立ち上げた後で確認できる。

解法はここを展開

「Launch Instance」を押すと問題の詳細が表示され、以下のようにssh接続を促される。

$ ssh -p xxxx ctf-player@rhea.picoctf.net

とりあえず ls をすると

$ ls
checksum.txt decrypt.sh files

となっており、filesを見ると
02kLdPvr 3HWGffFE 6JGob933 AXwbPGqz F7pJKgt3 …(以下省略)
と大量のファイルがある。

解説には decrypt.sh files/<file> でいけるようなことが書いてある。

主はこの時点でCTFを1問も解いたことがない状態だったのでさっぱりだった。

ヒントを見ると sha256sum というコマンドを使うらしいので調べた。

「sha256sum」コマンドは、ファイルをダウンロード(コピー)した後に、破損や改変がないことを確認するために使うコマンドです。ファイルを読み込み、ハッシュ値を表示、照合できます

そういえばchecksum.txtの中身がハッシュ値っぽかった。($ cat checksum.txt で見れる)

$ sha256sum <ファイル名> でハッシュ値を表示できるらしいので、$ sha256sum files/* を実行。

雑にターミナルの cmd + f でchechsum.txtの中身のハッシュ値を探すと該当のファイルが1つ見つかった。

$ decrypt.sh files/<該当のファイル名> をすると無事 picoCTF{<答え>} が出てきたので提出して無事AC。

2. Scan Surprise

https://play.picoctf.org/practice/challenge/444

(Description)
国旗をテキストで配るのはもう飽きた。 代わりに画像だったらクールだと思わない? チャレンジファイルはこちらからダウンロードできます: challenge.zip その他の詳細は、チャレンジインスタンスを立ち上げた後にご覧いただけます。

解法はここを展開

challenge.zipをおもむろにダウンロードするとQRコードの画像が出てくる。

スマホで読み取ったら答えのテキストが出てくるので貼り付けてAC。

3. Binary Search

https://play.picoctf.org/practice/challenge/442

(Description)
ゲームをしたい? シェルをもっと使うようになると、その仕組みに興味を持つかもしれない! バイナリサーチは、ソートされたリストから項目を素早く見つけるために使われる古典的なアルゴリズムです。 あなたは旗を見つけることができますか? サイバーセキュリティには、ログ、脆弱性レポート、フォレンジックなど、目を通すべき膨大な量のデータがあります。 手作業で基礎を練習しておけば、将来、自分でツールを書かなければならなくなったときに役立つかもしれません!チャレンジのファイルはこちらからダウンロードできます: challenge.zip その他の詳細は、チャレンジのインスタンスを起動した後にご覧いただけます。

解法はここを展開

ssh接続を促される。

するといきなり

Welcome to the Binary Search Game!
I'm thinking of a number between 1 and 1000.

となり、ゲームが始まる。

見た感じ、二分探索で1 ~ 1000 の中にある答えを導き出せといったところ。

値を入れると、その値より大きいか小さいかが帰ってくるので、それを頼りに答えを導く。

二分探索なのでひたすら真ん中の値を入力していけばOK。

Enter your guess: 500
Higher! Try again.
Enter your guess: 750
Lower! Try again.
Enter your guess: 625
Lower! Try again.
Enter your guess: 562
Higher! Try again.
Enter your guess: 594
Lower! Try again.
Enter your guess: 578
Higher! Try again.
Enter your guess: 590
Higher! Try again.
Enter your guess: 592
Lower! Try again.
Enter your guess: 591
Congratulations! You guessed the correct number: 591
Here's your flag: picoCTF{<答え>}

4. heap 0

https://play.picoctf.org/practice/challenge/438

(Description)
オーバーフローはスタックだけの問題なのか? バイナリのダウンロードはこちら ソースのダウンロードはこちら その他の詳細は、チャレンジ・インスタンスを立ち上げた後にご覧いただけます。

解法はここを展開

ヒープということで、メモリ領域のヒープの知識が必要となる。

詳しい解法の解説記事があったので解説は省いてリンクを貼っておく。

https://qiita.com/koikoi193193/items/4e9df7c74996592974a8

5. format string 0

https://play.picoctf.org/practice/challenge/433

(Description)
あなたのフォーマット文字列の知識を使って、お客様を喜ばせることができますか? バイナリのダウンロードはこちら ソースのダウンロードはこちら その他の詳細は、チャレンジ・インスタンスを立ち上げた後にご覧いただけます。

解法はここを展開

format指定子の知識が問われる問題。

コードを見ると、1つ目の質問では64文字以上の選択肢を選ぶ必要があるが %{n}d が n文字の整数というformat指定子なので 114%d が含まれる選択肢を選ぶと正解になる。

2つ目の質問では、

Sponge Bob wants something outrageous that would break the shop (better be served quick before the shop owner kicks you out!) 
スポンジ・ボブは、お店が壊れてしまうようなとんでもないものを欲しがっています(お店のオーナーに追い出される前に、早く出した方がいいですよ!)

と書いてあるので、SIGSEGV(セグメンテーションフォールト、通称セグフォ) のことを暗示している。

SIGSEGV はプログラムがメモリに対して不正なアクセスを試みたときに発生するシグナルで、具体的には無効なメモリアドレスの参照、配列の範囲外アクセスなどが含まれる。

なので選択肢を見ると%sを含んでいるものがあるが、%sは引数なしでprintfするとSIGSEGVになる。のでそれを選ぶと正解。

この問題も解説をしている人がいたのでリンクを貼っておく。

https://qiita.com/koikoi193193/items/a94cb85f7d91e0f1a679

6. WebDecode

https://play.picoctf.org/practice/challenge/427

(Description)
ウェブ・インスペクターの使い方をご存知ですか? 詳細は、チャレンジ・インスタンスを立ち上げた後にご確認いただけます。

解法はここを展開

Descriptionにある web inspector (ウェブ・インスペクター) とは、ウェブブラウザに搭載されているデベロッパーツールの一部で、ウェブページの構造や動作をリアルタイムで調査・編集するための機能です。

HTML や CSS, JS の中身を見ることができます。

ブラウザによって開き方が若干違いますが、Chromeの場合(mac)「cmd + option + i」のショートカットで開くことができます。ブラウザの右上の3点リーダーから「その他のツール > デベロッパーツール」からも開くことができます。

/about.html にいき、HTMLを見ると notify_true=”cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfZGYwZGE3Mjd9″となっており、これが怪しいことがわかります。

ここからは推測で、問題のタイトルがwebDecodeとなっているので、web上で使われる形式と実際の値をみて、base64でエンコードされていると推測します。

適当なウェブ上でデコードできるサイトに上記の値を入れると、flag が取得できます。

主が使ったデコードサイトは以下
https://gchq.github.io/CyberChef/

7. Unminify

https://play.picoctf.org/practice/challenge/426

(Description)
私は自分のウェブサイトのコードを読むためにスクロールダウンするのが好きではないので、それを縮小しました。 ボーナスとして、ページの読み込みが速くなりました!詳細については、チャレンジ・インスタンスを立ち上げた後にお知らせします。

解法はここを展開

こちらもウェブインスペクターを使えば flag が見つかります。

Chromeのdevツールを開いて、html内を「cmd + f」で「picoCTF{」とかで検索すると出てくる。

Xこの記事をポストする
この記事をLINEでシェア
zawa1205

zawa1205

Qiita
GitHub
mail

webフロントエンドエンジニア