制作日記

こういうの作った方が、逃げにくいじゃない

解析手順

適当に書いとく

基本的には、色々と解析方法があって、それを組み合わせて追う
感覚的なとこもあったりするから、何をすればいいのかとか汎用的な話を書くのは無理

具体例として、こないだ話題に上った1945個目の解析手順でも

まずcns見て、1945個目を弄ってること、弄ってる値が4Bxxxx辺りであることを確認
ここは知識量が物を言うけど、その辺は弄って意味のある値がない
というか、基本的には使われない領域であることから、コードを書き込んでるんじゃないかと推測
もう一か所1945個目を弄ってる個所があったけど、そっちには気付いてなかった
この時点で、cnsを全部眺めたらafterimageが怪しいことに気付けると思う
そんでもって、如何にもな値から、コード実行臭いなーと予想はできるはず

自分はcns見なかったんで、気づいてない体で進める

とりあえず、デバッガを起動
メモリへのwriteでブレークポイント貼れれば、何でもおk
1945個目にwriteでブレークポイント貼った状態で、適当にカンフーマンを動かす

プレイヤーアドレスの取得方法は、色々ある
プレイヤーのnameを有意なものにして、それで文字列検索
nameの16byte手前が先頭アドレスだっけ?
メモリのウォッチができるなら、[[0x4b5b4c]+0xb754]で1Pの先頭アドレス
あとは、そっからpersistentまでの距離+1945個目にBPを貼る

で、適当に動かしてBPに引っかかったらステート番号確認
適当にステコンを抜きつつ、どのステコンで引っかかったのか確認
afterimageで引っかかってるっぽい

afterimage実行時と、終了時に1945個目が変更されることを確認
1945個目で指定されてるアドレス周辺に、それっぽい値が書き込まれていることを確認
afterimageで確定っぽい

cns上のafterimageを確認
如何にもコードっぽいのを書き込んでるのを確認

じゃあ、どうやってコード実行してるんだ?

よく見たら1945個目に書き込んでるのが2か所あるっぽい
一か所は上述した基本的に何もしない箇所
cns的にもここでコード書き込み先指定してるのはほぼ確実

もう一か所は以前記事にした関数ポインタ辺りっぽい
じゃあ、コード書き込んだ後にこれで関数ポインタ書き換えてコード実行してる臭い

以上、解析完了

elemとか累乗でのフリーズ原因を解析するのは、アセンブラ読めないと話にならないけど、
これなら、基本的にアセンブラ読める必要はないね
関数ポインタ書き換えて云々はcall命令だけだし、なんとなくわかると思う
というか、コード実行してるってことさえわかれば、
どうにかして実行してるんだろうなーぐらいで済まして良いんじゃね?

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク