ピカチュウ版の任意コード実行

飛べるよ!ピカ版だって飛べる!赤緑のように!

概要

ピカチュウ版では通常の手段で任意コード実行はできませんが、アイテムを持ち込むことで赤緑の「5かい」に似た任意コード実行に持ち込むことが可能です。

解説

ピカチュウ版と赤緑の違い

ピカチュウ版ではセレクトバグが完全に修正されており、道具欄以降のメモリを好きにいじったりすることは基本的にはできなくなりました。 また、ポケスタ金銀経由で「5かい」を持ち込んでも道具処理のエントリポイントがずれているのでD123には飛んでくれません。 ちょっと手前にずれているだけなので運と主人公の名前次第では動きますが、「れ」はjp c命令なのでキャリーが立っていると「だん」のアドレスに飛んでしまいます。 これは実用上困る。

5かいの代用アイテム

ということで、5かいの代用になるアイテムを探しました。候補は今まで「使うとフリーズする」と言われいてたアイテムで、かつ名前が20byteに収まっているものです。 本当は道具処理エントリポイントを一覧から読み込む部分のプログラムを読んで特定できれば良かったのですが、その時はいまいちちゃんと読めなかったので総当たり。 飛び先はできるだけ制御しやすい場所、具体的にはPC/手持ちどちらでもよいので道具欄、ニックネームあたりに行ってくれれば制御しやすいのでその辺を狙います。

はやぶさバッヂのエントリポイント

調査の結果、戦闘強制中断でお馴染みの「はやぶさバッヂ」の飛び先がD4CAに設定されていることが分かりました。これはパソコンの道具9番目の種類にあたる場所なので、容易に制御が可能です。しかし、ピカチュウ版ではセレクトバグで道具を増やすことができず、ポケスタでは99個に減ってしまうらしいので最大でも99個が限度となります。 よって、道具欄にプログラムを書くのは現実的ではありません。じゃあニックネームに飛ばそう。

jp DE64

極論この3バイト命令1つを書ければいいだけなので簡単です。c3は・・・ぎりぎり駄目じゃねーか!jrで飛ぶにも遠すぎるので、ちょっと考えます。

  1. c3を個数にずらす: 100個を超えるので没。しかも続く2バイトがおじぞうバッヂde個。
  2. jp z/jp nz/jp c/jp ncを使う: いずれも個数に64が来てしまうので没。de63にしても大丈夫っちゃあ大丈夫だが・・・
  3. call de63 + ret: 個数として使えないde c9が連続してしまう。
  4. 適当な16byteレジスタにldしてからpushしてret: この案で行こうと思ったら・・・
  5. jp hl: そういえばこんなものありましたね・・・
ということで試し書き。de63はボックス30匹目の親名6文字目なので、00か50しか入っていないことを期待できます。

21 63 de; ld hl, de63
e9; jp hl

e9が個数に来てしまったので適当になにか1byte入れてずらす必要があります。あれ、余ってるしinc hl入れてde64にできるんじゃ・・・

21 63 de; ld hl, de63
23; inc hl
e9; jp hl

ということで完成形になりました。これで今まで緑用に書いたコードも使いまわしができます。

見つけたよ、任意コード実行!


戻る
connecting: riko.2rnd.msmrrneda.net