0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1. はじめに

picoCTFのGeneral Skills問題「fixme 2」の解説(Writeup)です。

2. 問題の概要

Easy問題です。
「The Rust saga continues? I ask you, can I borrow that, pleeeeeaaaasseeeee?」という問題文で、「borrow(借用)」というヒントが隠されています。

コードをダウンロードして実行すると、エラーが発生するので、コードを修正し、再実行していく流れです。

3. エラーとの格闘と解決のプロセス

一つ目のエラー:関数側で変更できない

  • エラー内容:
cannot borrow `*borrowed_string` as mutable, as it is behind a `&` reference
  • 原因:
    関数 decrypt の引数が borrowed_string: &String のように不変参照になっていたため、関数内で .push_str() を使って文字列を書き換えることができなかった。
  • 修正内容:
    引数の型を &mut String(可変参照)に変更。

(修正前)

fn decrypt(encrypted_buffer:Vec<u8>, borrowed_string: &String){

(修正後)

fn decrypt(encrypted_buffer:Vec<u8>, borrowed_string: &mut String){

2つ目のエラー:呼び出し側の型が合わない

  • エラー内容:
mismatched types
  • 原因:
    関数側を &mut(可変参照)を要求するように直したのに、呼び出し側が &party_foul(不変参照)のままだったため、型ミスマッチが発生した。
  • 修正内容:
    呼び出し部分を &mut party_foul に変更。

(修正前)

decrypt(encrypted_buffer, &party_foul);

(修正後)

decrypt(encrypted_buffer, &mut party_foul);

3つ目のエラー:変数自体が変更不可

  • エラー内容:
cannot borrow `party_foul` as mutable, as it is not declared as mutable
  • 原因:
    可変参照(&mut)として貸し出そうとしたが、大元の変数 party_foullet で宣言されており、不変(変更不可能な変数)になっていた。
  • 修正内容:
    変数宣言を let mut party_foul = ... に変更。

(修正前)

let party_foul = String::from("Using memory unsafe languages is a: ");

(修正後)

let mut party_foul = String::from("Using memory unsafe languages is a: ");

これで再実行(PowerShellでcargo run)すると、flag文字列が得られました。


4. まとめ

Rustで関数に渡したデータを書き換えてもらうには、以下の3箇所すべてに mut(可変)の意思表示が必要

  1. 大元の変数: let mut party_foul = ... (変更を許可する変数にする)
  2. 渡す側(呼び出し): decrypt(..., &mut party_foul) (変更可能な形で貸し出す)
  3. 受ける側(関数定義): fn decrypt(..., borrowed_string: &mut String) (変更可能な形で受け取る)

どれか1つでも欠けると、Rustのコンパイラが安全性のために止めてくれる。

5. おわりに

Rustの基礎を学べる良問でした。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?