
ハードウェアハッキングCTF hcon2026hwctf - RISCV Hazard3 (@Wren6991) エクスプロイト by @b1n4ri0 @antoniovazquezblanco & @therealdreg
ハードウェアCTFに興味があるなら、ここにHC0N CTF 2026の最初の公開チャレンジがあります。RISC-V RP2350のエクスプロイトチャレンジ(低レベル)です。
我々は、何百人ものカンファレンス参加者がチャレンジを解くチャンスを得られるように、あまりエリート向けでも難しすぎないようにすることを目指しました。それが達成できているといいのですが。
CTFを自宅で実行したい場合は、Raspberry Pi Pico 2を用意し、このファームウェアを書き込んで、write-upsを読まないでください! -> ctf.uf2
CTFのものとは異なるボード(RP2350/RP2354...)を使用する方への注意:
CTF PCBにはGPIO 25にSMD LEDがあります。そのGPIOにLEDが必要です

このCTFが終わったとき、気に入ったなら、別のチャレンジで構成された類似のCTFもあります: https://github.com/therealdreg/ctfhardwarehackingcon2026
警告: 以下のwrite-upsにはチャレンジのネタバレが含まれています。自分で解きたい場合は、CTFを完了するまで読まないことをお勧めします。
第1位 勝者: @mrexodia (Duncan Ogilvie) writeups/first_winner.md

賞品: okhi hardware keylogger USB/PS2 kit + CWP (Certified WifiChallenge Professional) https://github.com/therealdreg/okhi
第2位 勝者: @M3RINOOOOO (Cristobal Merino Saez) writeups/second_winner.md

賞品: Pimoroni PGA2350, PICO2 WH, Pimoroni PICO PLUS 2W, PICO2 H, CWP (Certified WifiChallenge Professional)
第3位 勝者: @p4bl0vx (Pablo Moya Lopez) writeups/third_winner.md

賞品: Pimoroni PGA2350, PICO2 WH, Pimoroni PICO PLUS 2W, CWP (Certified WifiChallenge Professional).
ここでは、HCON 2026のHardware Hacking CTFをより簡単にするためのヒントを提供します。

Linuxホストが最初の選択肢になるべきです ;-)、デバッグがよりうまく動作します。
TeraTerm: Setup -> Terminal -> Transmit: CR+LF & [x] Local echo

その他:
cutecom:``` sudo apt-get update sudo apt-get install cutecom
# 警告
いずれかのチャレンジでは、ハードウェアデバッグが必要です。自宅でチャレンジを行う場合(別のボードを持つチームメイトがいない場合)、そのチャレンジを解決するには、次の2つのアイテムも購入する必要があります。(購入しなくても問題ありませんが、その特定のチャレンジは解決できません。)
- https://www.tiendatec.es/raspberry-pi-pico/2025-raspberry-pi-debug-probe-5056561803265.html
- https://www.tiendatec.es/raspberry-pi-pico/1979-cable-depuracion-pico-jtag-jst-sh-1-0-a-dupont-hembra-15cm-8472496024846.html
# スクリプトについて
このリポジトリに含まれるツールは、コミュニティ向け、特に2026 HCON Hardware Hacking Challengeのために@b1n4ri0によって開発されました。
# デバッグを備えたRP2350 RISCV Hazard3(@Wren6991)3ステージRV32IMACZb*プロセッサの活用
RISCV Hazard3は、デバッグサポートを備えた3ステージのRV32IMACZb*プロセッサです。これは、HCON2026HWCTFボードに搭載されているRP2350マイクロコントローラで使用されています。
# picotoolを使用したRISCV Hazard3ファームウェアのダンプ
`picotool`を使用したRP2350デバイスからのファームウェアダンプは、簡単なプロセスです。このセクションでは、効果的に行う方法を学びます。
注:`picotool`は、RP2350(およびRP2040)デバイスがBOOTSELモードの場合、または実行中のファームウェアにPico SDKのUSB stdioサポートが含まれている場合にのみ、それらのデバイスとやり取りします。
## picotoolのビルド
お好みのパッケージマネージャーを使用して、必要なビルドツールとライブラリをインストールします。```bash
sudo apt-get update
sudo apt install build-essential pkg-config libusb-1.0-0-dev cmake -y
ツールを整理するための専用ディレクトリを作成してください。これにより、後続のステップで使用するパスが正しいことが保証されます。```bash cd $HOME mkdir rptools cd rptools
`picotool` と `pico-sdk` のプロジェクトをクローンしてください。ツール自体とSDKの両方が必要です。なお、`picotool` を正しくコンパイルするには `pico-sdk` が必要です。```bash
git clone https://github.com/raspberrypi/picotool.git
git clone https://github.com/raspberrypi/pico-sdk.git
cd picotool
ビルドディレクトリを作成し、CMakeを実行します。
重要: 前のステップでSDKをダウンロードした場所をCMakeに正確に伝えるには、-DPICO_SDK_PATH フラグを使用する必要があります。または、環境変数 PICO_SDK_PATH を設定することもできます。```bash
mkdir build
cd build
cmake -DPICO_SDK_PATH=$HOME/rptools/pico-sdk ..
sudo make install
デフォルトでは、USBデバイスへのアクセスにはroot権限が必要です。`sudo`を使用せずに`picotool`を実行できるように、udevルールファイルをコピーしてください。```bash
sudo cp ../udev/60-picotool.rules /etc/udev/rules.d/
udev ルールを再読み込みする(またはデバイスを抜き差しする)と、picotool version を実行してバージョンを確認し、すべてが機能していることを確認してください:```bash
$ ./picotool version
picotool v2.2.0-a4 (Linux, GNU-15.2.0, Release)
## ビルド済みバイナリの使用
ビルドプロセスを省略したい場合は、[公式リポジトリ](https://github.com/raspberrypi/pico-sdk-tools/releases)からビルド済みバイナリをダウンロードできます。```bash
gunzip picotool-2.2.0-a4-x86_64-lin.tar.gz
tar -xf picotool-2.2.0-a4-x86_64-lin.tar
cd picotool
picotool version を実行すると、期待どおりに動作するはずです:```bash
$ ./picotool version
picotool v2.2.0-a4 (Linux, GNU-11.4.0, Release)
## RP2350でBOOTSELモードを有効にする
ファームウェアのダンプなどの操作を行うには、`picotool`はデバイスがBOOTSELモードである必要があります。ただし、現在実行中のファームウェアがPico SDKのUSB stdioサポートを含んでいる場合、`picotool`はデバイスと対話することもできます。
以下に、このモードを有効にするいくつかの方法を説明します。自分のケースに最も適していると思われるもの、または単に自分に合ったものを選んでください。
ボードが**BOOTSELモードではない**が、USB stdioサポート**,**を含んでいる場合、`picotool`コマンドを実行しようとすると、次のような出力が表示されます。```bash
$ ./picotool info
No accessible RP-series devices in BOOTSEL mode were found.
but:
RP2350 device at bus 1, address 23 appears to have a USB serial connection, so consider -f (or -F) to force reboot in order to run the command.
これは標準的なハードウェアによる方法です:
BOOTSEL または BOOT ボタンを押し続けます。BOOTSEL ボタンを離します。代替方法 (ボードを抜きたくない場合):
BOOTSEL ボタンを押し続けます。RESET または RST ボタンを押して離します。BOOTSEL を離します。これで picotool コマンドを実行できるようになります:```bash
$ ./picotool info
Program Information
name: hello_usb
features: USB stdin / stdout
binary start: 0x10000000
binary end: 0x10011d50
target chip: RP2350
image type: RISC-V
### BOOTSEL を有効にするソフトウェア
デバイスのファームウェアが実行中で USB stdio をサポートしている場合、基板に触れることなく BOOTSEL モードに強制的に移行できます。```bash
./picotool reboot -uf
このコマンドは、-u フラグを使用して、特に BOOTSEL モードへの再起動を指定します。ただし、デバイスは現在ユーザーコードを実行しているため、picotool はデフォルトでこれを無視します。したがって、実行中のアプリケーションにリセットコマンドを受け入れさせるには、-f フラグを追加する必要があります。
-f がない場合、ツールはデバイスがすでに BOOTSEL モードにあることを期待するため、操作は単に失敗します。```bash
$ ./picotool info
Program Information
name: hello_usb
features: USB stdin / stdout
binary start: 0x10000000
binary end: 0x10011d50
target chip: RP2350
image type: RISC-V
**ヒント:** コマンドに `-f` フラグを追加することで、手動で再起動することなく、実行中のデバイス上で直接コマンドを実行できます。`picotool` が再起動を処理し、コマンドを実行して、アプリケーションへ再起動して戻ります。```bash
$ ./picotool info -f
Tracking device serial number XXXXXXXXXXXXXXXX for reboot
The device was asked to reboot into BOOTSEL mode so the command can be executed.
Program Information
name: hello_usb
features: USB stdin / stdout
binary start: 0x10000000
binary end: 0x10011d50
target chip: RP2350
image type: RISC-V
The device was asked to reboot back into application mode.
このCTFチャレンジでは、BOOTSELモードに入らずにファームウェアを直接抽出できます。
実行中のプログラムに関する情報を収集することをお勧めします。これは、デフォルトで「Program Information」セクションを表示するinfoコマンドを使用して行えます。デバイスは現在コードを実行しているため、接続を強制するために-fフラグを追加します。```bash
$ ./picotool info -f
Tracking device serial number XXXXXXXXXXXXXXXX for reboot
The device was asked to reboot into BOOTSEL mode so the command can be executed.
Program Information name: hello_usb features: USB stdin / stdout binary start: 0x10000000 binary end: 0x10011d50 target chip: RP2350 image type: RISC-V
The device was asked to reboot back into application mode.
この出力 は、プログラム名、そのメモリ範囲、イメージアーキテクチャなどの重要な詳細を明らかにします。