FC2ブログ

制作日記

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

トップ

トップ
※申し訳ないですが、メールでの返信は出来ません。

DEP回避して任意コード実行
_reimu_ver191.ico

DTCリターンアドレス改竄テストキャラ(ver0.7xとは別物です)
_reimu_ver181.ico

MUGEN用プロセスメモリリーダ、memRead 最終更新 2013/11/17
memRead.ico
CUIアプリです、普通にアイコンをダブルクリックでも起動できます

リンクを右クリックして、「対象をファイルに保存」からダウンロード
ファイルの拡張子をrarに変えてから解凍してください

MUGENステコン入力支援マクロ
入力補完、短縮表記機能有り版(取説)
stateControl_2.js
入力補完、短縮表記機能なし版
stateControl_1.js
使い方とかはjsの先頭に書いてあるので、メモ帳で開くなりして読んでください

バグ報告等々コメントして頂けると助かります
公開物とそれらに関する情報の利用は、内容に依らず自由にして頂いて問題ないです

過去verは続きへ追いやられました

続きを読む

SAM氏の言うコードって

機械語でよかったんよな?
アセンブラの書き方説明すれば良かったんよな?

即値書き込む例を示すの忘れてたけど、アドレスedxに1を1byte書き込みたいなら
mov byte ptr [edx], 1
って書くだけやから、表記の変わるレジスタ指定より簡単やぞ

fvar:=

-- 追記 --
mugen本体弄って治す方法書いてるけど、cnsの計算式の方を括弧で括って対策するのが正しいと思うぞ。
-- 追記終わり --

https://sinomugen.blog.fc2.com/blog-entry-246.html
MUGENの構文解析が間違ってるね

00405A85 83FB14 cmp ebx, 14h
00405A88 0F84B8000000 je 00405B46h # var:= はここで405B46hにjmp, 恐らくfvar:=も同じ所へjmpをするべき
# 中略
00405AEA B807000000 mov eax, 00000007h
00405AEF EB3A jmp 00405B2Bh # fvar:= はここで405B2Bhにjmpしてしまっている


以下、解析内容
あと分かりやすくするために、fvar(x):= y は x fvar:= yと表記する。

1 fvar:= 2 fvar:= 10
でfvar(1)が2になる原因は2つ思い付く

構文解析ミスで結合が右から左ではなく左から右になっている
or
fvar:=の評価結果間違いで代入した値を持つはずが代入先のfvarの番号になっている

displaytoclipboardのparamsに1 fvar:= 10を指定して値を確認すると10になっている。
よって、原因は後者ではなく、前者の構文解析ミスと思われる。

MUGENは内部で計算式を後置表記で持っているので
1 fvar:= 2 fvar:= 10 は、1, 2, 10, fvar:=, fvar:= となる必要がある
ここを間違っていて、 1, 2, fvar:=, 10, fvar:= になっているのだと思われる

結合規則は構文上存在しない概念で、あくまでも構文規則から導かれるものでしかない
例えば、fvar:= の左辺にfvar:=を持つ式は入らない、右辺には入るという規則になっているはずで
1 fvar:= 2 fvar:= 10 を見た時
2つ目のfvar:= の左辺にfvar:=を持つ式が入るのはNGだから
(1 fvar:= 2) fvar:= 10 という解釈はNG
1つ目のfvar:= の右辺にfvar:=を持つ式が入るのはOKだから
1 fvar:= (2 fvar:= 10) という解釈になる

実際はそんなに難しくないし実装も楽なんだけど
ようはここの構文解析の実装がミスってる
どうミスってるかは自分で簡単な電卓とか実装すれば想像できるよ

var:= 同等にすれば良さそうなので、上記したswitch分のjmpテーブルを書き換える
winmugen.exeのoffset 6888hの2byteをEA5Aから465Bに書き換える

MUGEN内での計算式処理サブルーチン

ここらへんかなーって思いながら、確認するの忘れてた
アセンブラ読んだ感じだと00407780
引数は4つで、整数用/少数用の計算結果格納アドレスで2つ、残りは知らん
どうせ、キャラクターのアドレスと、計算式の指定でしょ

で、戻りのEAXが計算結果の種類を表していて、1なら整数、2なら少数、0なら計算失敗かな

やってること自体は、各トークンがトリガー、リダイレクト、数値、演算子か確認して
それに応じた処理しているだけ

昔、そこらへんのデータ構造は記事を書いたな
http://drabs.blog40.fc2.com/blog-entry-1517.html

探査とかでtriggerが真かどうかとか、changestateのvalueなんかもこれで事前確認できると思うんだけど
代入処理とかでvarが変更されたりと副作用があるから気軽には実行できんのよね
復元処理が必要になる

fvarとかの数値ズレ

https://sinomugen.blog.fc2.com/blog-entry-232.html
https://sinomugen.blog.fc2.com/blog-entry-186.html
fvar:=で少数を代入しようとすると何故かアドレスが書き換えられる?
0x407f7bの「call 004922ac」で呼んでる関数が原因っぽいけどイマイチ処理追えんかったのでよくわからん


call 004922acのサブルーチンは浮動小数点数を64bit整数に変換して、EAX/EDXに入れている。
で、変換後の整数からEAX = 下32bitを取り出して範囲チェックしてる。
# 004922acの説明は末尾に載せとく。

代入位置の値が変換前は単精度だから、誤差が出てるとかじゃないかな。
代入する値を整数にしたら起こらないけど、本末転倒というか今度は代入する値がズレる問題が起こる。

fvarの括弧内には浮動小数点数が入らないから変換処理不要なはず、つまりMUGENの演算処理が原因。
ザックリ言うと、演算を行う際にどちらかのオペランドが小数なら、小数でない方のオペランドも単精度浮動小数点数に変換している。
四則演算とかなら両オペランドの小数/整数を揃える必要があるけど、fvarなら不要。
むしろ、代入する位置は整数でなければならないから無駄でしかない。
各種演算のオペランド読み込み処理を共通化している都合なんだけど、なんというかダサい。

以下で出てくるFPUってのはfloating point unitって言う浮動小数点数を処理する専用の装置のこと。
浮動小数点専用に命令とかレジスタとかが用意されている。

004079EF |. DB4424 24 |FILD DWORD PTR SS:[ESP+24]
004079F3 |. D95C24 18 |FSTP DWORD PTR SS:[ESP+18]

整数で保存している値を小数に変換してるところ。
FILDで整数をFPUレジスタに積んで小数に変換させて、FSTPで単精度浮動小数点でメモリに格納。
ここでDWORD指定している=4byteだから単精度の浮動小数点数に変換していることになる。


00407F77 |. D94424 18 |FLD DWORD PTR SS:[ESP+18]
00407F7B |. E8 2CA30800 |CALL winmugen.004922AC
00407F80 |. 8BD8 |MOV EBX,EAX
00407F82 |. 895C24 24 |MOV DWORD PTR SS:[ESP+24],EBX
00407F86 |> 85DB |TEST EBX,EBX
00407F88 |. 7C 1F |JL SHORT winmugen.00407FA9
00407F8A |. 83FB 28 |CMP EBX,28


さっきと逆変換で[ESP+18]の小数を整数に変換して0~28の範囲チェックをしている。
FLDでFPUレジスタに積んで、004922AC呼び出し。
変換した整数の下32bitが入っているEAXの値を確認して範囲チェック。

以下、004922acの説明。WAITとLEAVEはお作法だから無視して良い。

004922AC /$ 55 PUSH EBP
004922AD |. 8BEC MOV EBP,ESP
004922AF |. 83C4 F4 ADD ESP,-0C
004922B2 |. 9B WAIT
004922B3 |. D97D FE FSTCW WORD PTR SS:[EBP-2] #FPU制御ワードを[EBP-2]に格納。
004922B6 |. 9B WAIT
004922B7 |. 66:8B45 FE MOV AX,WORD PTR SS:[EBP-2] #AXに取り出して。
004922BB |. 80CC 0C OR AH,0C #丸めモードを0方向への切り捨ての値にして。
004922BE |. 66:8945 FC MOV WORD PTR SS:[EBP-4],AX # [EBP-4]に格納。
004922C2 |. D96D FC FLDCW WORD PTR SS:[EBP-4] # それをFPU制御ワードに設定(要は小数点以下切り捨てで整数に変換する用の丸めモード変更)
004922C5 |. DF7D F4 FISTP QWORD PTR SS:[EBP-C] # FPUレジスタの小数を整数に変換して[EBP-C]に格納、丸めモードにしたがって小数点以下切り捨て。
004922C8 |. D96D FE FLDCW WORD PTR SS:[EBP-2] # FPU制御ワードを元に戻す。
004922CB |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] # 戻り値を格納(8byte整数だからレジスタ2個使う)
004922CE |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] # 戻り値を格納(8byte整数だからレジスタ2個使う)
004922D1 |. C9 LEAVE
004922D2 \. C3 RETN


プロフィール

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

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