ポケットモンスターシリーズのバグ技についてまとめます。

概要

穴抜けの紐の任意コードの実行をボックスのポケモンを利用して行う方法です。
上記の記事を理解した上で読むことをオススメします。

準備

ボックス12の2行目、5列目にこのポケモンを並べます。
PIDTIDSID
0x030451036528202048
0x0200203A57380
0x4927301A57380
0xBDF06008
0x02065728

一番下の5匹がそれぞれのポケモンになります。

バトルで使うポケモンには技0x2B5Cを覚えさせてください。

実行

同様にアニメーションをオンにして洞窟に入り技を使い戦闘から逃げたりしてあなぬけのヒモを使います。

解説

ボックスで行うやり方ではコードが長すぎるため現実的に再現が難しかったのでコードを区切り準備をしやすいようにしました。
具体的にはボックス内のポケモンのPID, TID, SIDを使います。これらのデータは連続している上0x00~0xFFまでの任意の値にできるため汎用性が高いです。

"技0x2B5C"のアニメーションは"0x02030400"を参照します。このアドレスはRAMで変動する範囲でボックス内のポケモンにあたります。

1匹目
0x02030400: 03 51 04 03 02 FF 00 08

0x02030451にジャンプするコードです。
SIDにあたる末尾2byteの00は00~7F(?)までの範囲でも問題ないように動くかもしれません。(要検証)

2匹目
0x02030450: 3A 20 00 02 24 E0

3匹目
0x020304A0: 1A 30 27 49 24 E0

4匹目
0x020304F0: 08 60 F0 BD

5匹目
0x02030540: 28 57 06 02

このページへのコメント

いつもお世話になっております
デテロニーです

この度、当サイトの情報を参考にして、実機Emにて任意コード実行に成功しました
ただし、読み込むアドレスは少し変えてあり、ポケモンの性格値〜ではなく努力値〜を読み込むように工夫しました

使用したバグ技は0x0D1Dで、アドレス0x020304C0(ボックス12の28番目のブロック内データの始め)を参照します
命中・PP共に0なので少し厄介です

ブロック内データの始めがEブロックからになるよう、用意するポケモンの性格値はPID%0x18=0xC〜11とし、ブロック内データはメモリ上、性格値及び表裏IDとXORされて暗号化されているので、これを解錠化する為に性格値(PID)=ID値(SID-TID)となるパッチールをRS孵化乱数調整で入手しました
具体的には、
・ID:表50909裏11843(0x0x2E43C6DD)
・性格値:0x2E43C6DD
・PID%0x18=0xD(EGMA)
という個体を私は使用しました

このパッチールをコピーし、H努力値から美しさまでの8バイトを使用して、当サイトのコードを参考に、
・0x020304C0:03 11 05 03 02 FF 00 08
・0x02030510:38 20 00 02 24 E0
・0x02030560:1A 30 27 49 24 E0
・0x020305B0:08 60 F0 BD
・0x02030600:28 57 06 02
(最果ての孤島行き)
というコードを組みました
このパッチール5匹をボックス12/28〜13/2に並べ、任意コード実行を試みた所、無事成功が確認出来ました

この方法であれば、たった1度の簡単なID調整とたった1匹のパッチールのRS孵化乱数調整を行うだけで個体調達が完了するので、準備のハードルが低いことが利点ですね
また、努力値でコードを組むので調整が容易で、別のワープ先に変更する調整を簡単に行えるのもポイントです


お陰様で解析環境もアセンブラの知識も全くない私でも任意コード実行が出来ました
ありがとうございます

研究が進めばFRLGでも、果ては第4世代でも応用可能になるかもしれませんね

17
Posted by デテロニー 2019年06月10日(月) 13:49:23 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます