はてなキーワード: eXploitとは
ツールにひっかかるから、ですらないと思う。単にそういう技が必要なくなっただけ。 そもそもexploitに晒されるほどポピュラーでかつOSの動的リンク機能が使えるほど近代的な環境になってさえ、動的コードセグメントを使ってまで最適化スピードアップしなきゃいけないような変態的ケースは今じゃ殆ど無いんじゃねーの。ゲームかPC DEMOくらい? ひょっとしてケータイでもそういうことをやるのだろうか。 そもそもそれ以前にアルゴリズムの改善とかアーキテクチャの見直しとかできることは山ほどあるような気もするが。 というかツールで監視するくらいならCPUの保護機能でオフにするんじゃないのという気もする。
人工知能的なことをやりたいのであればCは圧倒的に不向きで、そもそもevalがある言語(Python/Ruby/etc..)使えばいいんじゃねーの、という話になる。もちろん Lisp/Schemeもそうだけど。。。
(追記に対してレス…)
void *(*psrc)(void *); void *pdst = (void *)psrc; 究極 printf("%x\n",(int)psrc);
そーいうのは曖昧と呼ぶの? どちらもC言語的には未定義動作で、単にコンパイラがこういう風にコンパイルしますよということが分かっているから書くのだし、何もambiguousではないよね。
そーいうことはxbyakとか使えば楽にできるとおもう
○メモリ上にプログラムを自力でロードして、それを関数ポインタに変換して関数コールすると、Exploit系のバグなのか、わざとやっているのかが外部ツールで判別付かない場合があるので、この方式は使わなくなり、現在はDLL呼び出しやSO呼び出しが一般的。
ちゃんとExploit系に使われる関数ポインタはクラックの対象ってExploitというキーワード書いたのに(T_T)。高々、コンパイラが保証してくれる範囲の関数ポインタは安全だから使えばいいと思うよ。
究極
printf("%x\n",(int)psrc);
こういう技が必要になることもあるし。
Cって面白いと思う。
char *prog="\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
void *(*psrc)(void *) = void *(*)(void *)prog;
(*psrc)(NULL);
こんな感じで、データ配列のプログラムとしての実行で、昔はあったけど、いまはこういうコードはDLLとかSOとかで書くのがお作法だよねーと
さらにいえばWindwosならCOMで書けと・・・
どうみても、Code Exploitのバグに見えるもの、この手のコードは。
外部ツールがバグとして引っかけちゃうから書かないのが最近の主流だと思う。書く必要もほとんど無いし。
Lispのようにプログラム自身がメモリ上に動的にプログラムを必要に応じて計算しながら書き込んで、それを実行すれば、ある意味人工知能的なプログラムとその美しさが実現できるけど、それは一般的なプログラムの範疇ではバグの検出が複雑になるので、やっちゃダメとはいわないが特殊分野の技法だなぁと思う限り。