制作日記

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

雑記

DTCのオバフロの変数化

オバフロは書式指定子展開後の話やし、これでええやん
[state ]
type = DisplayToClipboard
text="%1024c%c%c%c"
params = 108,74,64,75

lea命令の存在意義
フラグレジスタが変わらない
あとはアドレス取るのなんてよくやることだし、少しでもクロック数少なくしたかったんやろ
他の命令で実現できるかどうかは、代替手段を用意しない理由にはならんし
アドレスのロードとmov、add、subみたいな数値計算ではやってることの意味合いが違う

雑記

追記
なんか他でも書いた気がしないでもないが、もうちょい丁寧に書くわ

stetedefのラベル名を読み込む領域がスタック上に一定量しか用意しないことを利用して
ラベル名をそれ以上の長さにすることでオーバーフローを発生させる
この時点でcnsがヒープに展開済みで、そのアドレスはスタック上に存在している
RET命令を実行したときにそこがリターンアドレスになるような
良い感じにesp弄ってRET叩くコードが既存のコード中に存在するので
オーバーフローでリターンアドレスをそこに差し替えると
そこに飛んで良い感じにespが弄られて、RETでcnsに埋め込んだコードに飛ぶ
あと、試合中のコード実行と違って、オーバーフローするのはサブスレッドだった気がするわ

正直、ステコン介さずコード埋め込むなら、cnsにこだわる必要性を感じない
自前のライブラリかexe動かせばええやん、そっちのほうが自由よ?

追記ここまで

cns内に埋め込んでおいたアセンブラを実行させる


def buffer overflowはこれぐらいしか書いてないな
http://drabs.blog40.fc2.com/blog-entry-1427.html#comment473

overflowについてだけならもっと前にも書いてるけど
cnsに埋め込んだコード実行する方法まで言及したのはここぐらい?

少なくとも、試合中にちょろっとコード実行するのに比べたら大分難易度高いと思うし
原理を聞いたら後は自分で出来ますってぐらいじゃないと、目的に合ったコードを完全自作するのは厳しいんじゃねーかな

他にちらっと見かけた疑問だと
%1021c%c%c%cJ@K
これの意味ぐらい?原理は十分すぎるぐらい書いてんだけどなぁ
http://drabs.blog40.fc2.com/blog-entry-970.html

> スタック上に数か所同じ文字列がぶち込まれてるから、そこのはみ出した分の補修が必要
実際に動作見てみたら補修必要なかったから、この1文だけは嘘だけど

以下、一応解説

%1021c%c%c%c
ここは1024文字ぴったり出力できれば、何でも良い
後ろ3つの%cは何の意味もない、色々弄ってた時のが残ってるだけ

J@K
は必須、アドレスの低いほうから順に0x4A,0x40,0x4B,0x00を書き込んで
リターンアドレスを0x004A404Bに差し替えてる

だから、DTCでコード書き込むときに先頭が0x4B404A=4931658なわけ
ここの書き込み場所をずらしたら当然J@Kも変える必要がある
0x4B404BならK@K
0x4B4030なら0@K
みたいに

def buffer overflowはクラック用途で言えば
キャラ選択が必要な時点で他と大して変わらんやろ
試合中でも良いからDEP回避のほうが有用?やし、あんま興味ない
読み込んだ瞬間にクラックとかだと良いね、sff辺りでできないかなー
ヒープ破壊ネタならあるけど、Windows10だと攻撃はキツイ
Windows XP以前とかみたいにガバガバならどうにかできるかもだが
XPなんて何年も前に捨てたよ

探査

http://samsara01.blog.fc2.com/blog-entry-20138.html

> 確かステート内のステコンも調べようと思えば調べれるから、潜って落ちる心配もなくなるゾ

調べられるで
ignorehitpauseもpersistenも調べられで
例外あるけど、ステコンのオプションも直値で書いてあれば調べられるで
value=0+0とか計算式になるとくっそ面倒

例えば↓みたいなvalue=0のステコンも引っ掛けられるで
[state ]
type=lifset
trigger1=~~
value=0

コードじゃないけど、possetがfloatかintかを調べたことあるで
http://drabs.blog40.fc2.com/blog-entry-1516.html
確かxが直値なら0x04E2ABFCの値がそれ
xが直値じゃなくて計算式なら計算式へのポインタになってる
その前8byteがフラグやらの情報で、この8byteで直後の4byteが直値か計算式か判断してるんだったっけか

nullmk 一応完成

windows用のバイナリ 64bit
nullmk.ico
使い方
nullmk.exe -i 入力ファイル -o 出力ファイル

git
https://github.com/drab-l/nullmk
$ git clone git@github.com:drab-l/nullmk.git
$ mkdir nullmk/build
$ cd nullmk/build
$ cmake ..
$ make
installはなし、build/srcにnullmk作成

以下入力ファイルのフォーマット
・ループ指定
フォーマット:${L:ラベル名:ループ回数式:~~}
 ~~内をループ回数分出力
 ~~内に更に入れ子でループとか後述の数値計算を定義できる
 ループ回数式は計算式で指定可能、変数も参照できる
 ループ回数式の計算タイミングはループ開始時点
 一度ループを抜けて再度ループを開始する場合、開始タイミング時に再計算する
 ラベル名はアルファベットと数字のみ指定可能、前後に空白がある場合はその空白は無視する
 ラベル名はそのまま変数名になっていて、該当ラベルの現時点でのループ回数を参照できる
 変数の値は0から始まるから1回目のループだと0になる、ループ外で参照した場合は0を返す 

・計算式
フォーマット:${C:計算式}
 計算式の結果を出力、+ - * / ( ) 変数に対応
 変数の参照方法は$変数名
 実数/整数は「.」の有無で自動判断

・文字列
 その他文字列
 エスケープシーケンスを除いてそのまま出力する
 変数は使用不可、変数参照は計算式で実施すること

・エスケープシーケンス
 文字列中に"${"などを出力したい場合は、直前にバックスラッシュを付ける
 バックスラッシュ "\"の直後1文字はただの文字となる
 ループ指定や計算式の一部としては解釈されず文字列と解釈される
 バックスラッシュ"\"自身を出力したい場合は"\"を2回連続で記述する
 ただし、計算式中にバックスラッシュは使用できない

nullmk

とりあえずwindowsで使えるようになった
posix依存コード外したし、最近のVCならビルドも通るみたい

windows用のバイナリ 64bit
nullmk.ico
使い方
nullmk.exe -i 入力ファイル -o 出力ファイル

次はループ回数の数式対応
A B A BB A BBB A BBBB
みたいな出力は今のフォーマットだとループ化できないからね

${L:TOP:4: ${L:SUB:$TOP+1:B} }
で出力できるようにしたい

ほんとは別スレッドで出力したほうが良いんだけど、C99では非同期IOを導入できん
世のlibcは早くC11に対応してくれませんかね
プロフィール

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

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