はじめに
picoCTF(CyLab)の問題Rust fixme 3(General Skills、Easy)の解法メモです。
私はRustを一度も触ったことがなかったのですが、この問題を通してRustの環境構築や、Rustならではの「安全性」の仕組みを学ぶことができました。
0. 環境
- Windows11
1. 配布ファイルの確認
ダウンロードした fixme3 というフォルダを開くと、中身は .rs ファイル(Rustのソースコード)だけではなく、以下のような構造になっていました。
-
src/フォルダ(中にmain.rs) Cargo.tomlCargo.lock-
target/フォルダ
2. 最初の躓き:ブラウザ(Rust Playground)では動かなかった
最初は手軽に済ませようと、Webブラウザ上でRustを動かせる「Rust Playground」に main.rs の中身を貼り付けて実行してみました。
しかし、外部ライブラリ(xor_cryptor)が見つからないというエラーが発生。
どうやらRustでは、Cargo.toml という設定ファイルがないと外部ライブラリを読み込めない仕組みのようです。ブラウザ実行を諦め、自分のPCに環境を作ることにしました。
3. PCへのRust環境構築
以下の記事を参考にさせていただき、Windows環境にRustをインストールしました。
参考:Windows環境にRustをインストールする - Qiita by @rfukudome
- ブラウザで Rustの公式インストールページ(https://www.rust-lang.org/ja/tools/install)を開く
- 「rustup-init.exe」(私の場合は64ビット)をダウンロードして実行
- 黒い画面(コマンドプロンプト)が立ち上がり、選択肢のうち 1) Proceed with installation (default) と書かれているので、キーボードの 1 を入力して Enter
- インストール完了後、PowerShellを立ち上げ(※ここできちんと再起動するのがポイント)、
cdコマンドで問題のフォルダ(fixme3)まで移動 -
cargo runを実行
cargo runを実行すると、自動的にCargo.tomlを読み込んで必要なライブラリをダウンロードしてくれました。
4. プログラムエラー:unsafe
ライブラリの読み込みは成功したものの、画面にエラーが表示されました。
call to unsafe function `std::slice::from_raw_parts` is unsafe and requires unsafe function or block
エラーの意味
「std::slice::from_raw_parts は安全ではない(unsafe)関数だから、unsafeブロックの中で呼び出しなさい」 という意味でした。
Rustには、メモリを直接操作するような「一歩間違えると危険な処理」を行う際、開発者が「危険だと分かった上で、あえてこの処理を実行します」とコンパイラに宣言する仕組み(unsafe 機能)があります。
修正内容
エラーが指摘していた std::slice::from_raw_parts(...) の部分を、指示通り unsafe { ... } で囲むように修正しました。
// 修正前
let decrypted_slice = std::slice::from_raw_parts(decrypted_ptr, decrypted_len);
// 修正後
let decrypted_slice = unsafe { std::slice::from_raw_parts(decrypted_ptr, decrypted_len) };
main.rsをメモ帳で開いて上書き修正しました。
最初は}の位置を間違え、波括弧の範囲を広げすぎて、変数が見つからないエラーになりました(error[E0425]: cannot find value *** in this scope)。
もしE0425エラーになった場合は、波括弧の終点位置をご確認ください。
5. フラグ獲得!
修正を保存し、再度 cargo run を実行。
今度はエラーなくプログラムが完了し、画面に無事 picoCTF{...} のフラグ文字列が出力されました。
まとめと感想
今回学んだことは以下の2点です。
- Rustの環境構築とCargoの便利さ:設定ファイルさえあれば、裏で勝手にライブラリを整えてくれるのが快適でした
- コンパイラの親切さ:エラーメッセージが「どこがダメで、どう直すべきか」を教えてくれるため、未経験でも迷子にならずに済みました
Rustの「安全性に対する思想」に触れることができ、とても勉強になる良い問題でした。