最終更新: pomegjapan 2019年05月07日(火) 10:30:39履歴
ボックスで行うやり方ではコードが長すぎるため現実的に再現が難しかったのでコードを区切り準備をしやすいようにしました。
具体的にはボックス内のポケモンの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
0x020304A0: 1A 30 27 49 24 E0
0x020304F0: 08 60 F0 BD
0x02030540: 28 57 06 02
具体的にはボックス内のポケモンの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世代でも応用可能になるかもしれませんね