2008-12-31

http://anond.hatelabo.jp/20081231093830

×クラックされるから関数ポインタを使わない

メモリ上にプログラムを自力でロードして、それを関数ポインタに変換して関数コールすると、Exploit系のバグなのか、わざとやっているのかが外部ツールで判別付かない場合があるので、この方式は使わなくなり、現在はDLL呼び出しやSO呼び出しが一般的。

ちゃんとExploit系に使われる関数ポインタクラック対象ってExploitというキーワード書いたのに(T_T)。高々、コンパイラ保証してくれる範囲の関数ポインタは安全だから使えばいいと思うよ。

ポインタ曖昧性はこんな感じかなぁ。

void *(*psrc)(void *);

void *pdst = (void *)psrc;

究極

printf("%x\n",(int)psrc);

だもんなぁ、任意引数関数ジャンプテーブルなんかで

こういう技が必要になることもあるし。

Cって面白いと思う。

Expolitまがいコード

char *prog="\x00\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のようにプログラム自身がメモリ上に動的にプログラムを必要に応じて計算しながら書き込んで、それを実行すれば、ある意味人工知能的なプログラムとその美しさが実現できるけど、それは一般的なプログラムの範疇ではバグの検出が複雑になるので、やっちゃダメとはいわないが特殊分野の技法だなぁと思う限り。

記事への反応 -
  • 少少梃子摺るけど、Cを最初に学ぶべきだと思う。ポインタを理解しないと他の言語でポインタを隠蔽している仕様を理解できない。 あたしはいつのまにかC#しかつかわなくなったけ...

    • http://anond.hatelabo.jp/20081230060518です。 自分の中で「プログラム言語を学ぶ」ということが「コンピューターの動作を理解する」と同義でした。実際にはポインタなんて暴走するプログラム...

      • 元増田っす 言語仕様がコンパクトなのがなぜ良いのかと言うと、実は2つ理由があります。 学ぶのが楽だから コンパイラを作るのが楽だから 1つめは「全体像を把握するのが楽」と...

        • ポインタと一口に言っても メモリポインタもあるけど、関数ポインタもあるっしょ? いまは、Code Exploitなどのクラックに使われちゃうので、やらないといえばやらないけど。 ディスク...

          • その辺のメモリポインタと関数ポインタのあいまいさがCのポインタの面白いところだと思うよ? よくわからんが何が曖昧なんだろう。 区別されているでしょ。 クラックされるから関...

            • ×クラックされるから関数ポインタを使わない ○メモリ上にプログラムを自力でロードして、それを関数ポインタに変換して関数コールすると、Exploit系のバグなのか、わざとやっている...

              • Exploit系のバグなのか、わざとやっているのかが外部ツールで判別付かない場合がある ツールにひっかかるから、ですらないと思う。単にそういう技が必要なくなっただけ。 そもそもexp...

                • 単にそういう技が必要なくなっただけ 必要が無くなったのは大前提だと思うけど? だから、昔はやったけど、今はやらない。DLLやSOがあるというのが1番の理由。でも、なんでDLLやSOが...

                  • あきらかに素人さん相手の説明でそりゃーないでしょ。というか、第1の問題点として指摘しているかのように書いてあるし。まぁいいけど。。。 そもそも、まさに動的リンク機能がOSに...

                    • 最初期の増田っす。 そもそも関数ポインタって、最近流行の言葉(笑)で言えばバッドノウハウだから、別に細かいこと良いんじゃないの? 関数呼び出しってのも「式」にしちゃうとコン...

                    • 関数ポインタはバッドノウハウどころか、手続き的な抽象を使いたいところで多用しますぜ。 C++やオブジェクト指向言語だと 継承と仮想関数を使うけど、同じようなケースで C言語では...

                      • そういうのはバッドノウハウとは言わないの?(「本来想定されていない使い方をするために、工夫してできるようにしちゃうノウハウ」を指してバッドノウハウと言うんだと思ってたか...

                        • そういうのはバッドノウハウとは言わないの? 関数ポインタをバッドノウハウとは言わないでしょ。C言語自体がバッドノウハウと言うなら、当たりだけど:) 手続きという抽象はまこと...

                          • 関数ポインタで、例示された5つを実現するのはバッドノウハウじゃないの? 「関数ポインタを使ってプログラミングしましょう」というプログラミングスタイルは、正統派ではないと...

                            • 例示された 5つ が 動的コード操作のことを指しているのなら、そりゃバッドノウハウかもね。 でも関数ポインタは… 「関数ポインタを使ってプログラミングしましょう」というプロ...

                              • うーん。 K&Rでも「5.11関数へのポインタ」で触れられてるのはqsortの話だし、そこで「関数へのポインタを定義できるよ」とはある。個人的にこれは意図していないけど載ってることだ...

                              • 関数ポインタはバッドノウハウになっているよ、確かに。 じゃぁ、何がグッドノウハウかというとC++のVirtual関数 C++の継承やVirtual関数は中身はvtableでvtableって何のこと?っていうと 関数...

                                • 関数ポインタがバッドノウハウ的であるような根拠があれば納得できるんだけど。 オブジェクト指向だってバッドノウハウじゃない?ツリーの途中で指摘されてなかった? 昨日からお前...

          • 関数ポインタも、結局関数がメモリに乗ってて、関数の開始位置をメモリのアドレスで表せるから使えるわけで、やっぱメモリポインタで良いんじゃないの? それをいうなら変数ポイン...

      • C/C++にいくつか思うこと (ちなみに、プログラマ始めたのはCができた頃でC++よりも私のプログラマ歴の方が長い) Cはポインタ というか、ポインタを使いこなすことで、チューニング...

        • Cはプログラミング言語の速度の基準になるくらい速いよね。 でも、チューニングに行き着くのは最後の最後じゃないかなあ。問題の立て方、解き方が間違ってる(最適でない)事が多い...

          • 組み込みだとコンパイラの最適化以前にそのハード用のコンパイラ自体なかったりするからやはりCって事になるんじゃないかと。組み込みやるのが一握りって事もないはず。

            • 組み込みって言っても、最近は、ほとんど、マーベルかシグマテル、なくてもARM系の亜種、大手家電メーカーの独自チップとほとんど決まり切ってるから、さすがにコンパイラが無いって...

          • チューニングは最初と最後にやる物だと思う。 最初にチューニングの方向性を決めて設計。 実装 必要な部分からチューニング という方法でないと、いざ、チューニングと思っても、設...

    • いや、「プログラミング」という行為を学ぶのにポインタという概念は、隠せるほどのものでしかないのだから、Cは2番目でいいだろう。 ちなみにおいらはCから習った。だが、一学...

    • 少少梃子摺るけど、Cを最初に学ぶべきだと思う。ポインタを理解しないと他の言語でポインタを隠蔽している仕様を理解できない。 あたしはいつのまにかC#しかつかわなくなった...

      • C言語におけるポインタの使い方って、ほとんどがメモリを直接弄るってものじゃない。今の言語で、あるアドレスに一定の値を加減算したアドレスを求めたり、そのアドレスの中の内...

    • とはいえ、参照や配列を理解するのにポインタは必須ではない、というか別概念だよね。 Cでは参照や配列を扱うときにポインタという生の実装がむき出しになってしまうけど。 OCamlやSML...

    • 元増田だけども。 「プログラミング」の最初期は、 逐次実行 変数 分岐 繰り返し 入出力 を使って、思ったことを実現すること(問題→モデル化→実装→実行)を実現するだけで充...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん