7

c の例を次に示します。

#include <stdio.h>
#include <string.h>

void bad() {
    printf("Oh shit really bad~!\r\n");
}

void foo() {
    char overme[4] = "WOW";
    *(int*)(overme+8) = (int)bad;
}

int main() {
   foo();
}
4

6 に答える 6

11

Python と PHP が他の人が示唆するように解釈されるという事実は、実際には重要ではありません。ポイントは、それらが公開するほとんどすべての API と言語セマンティクスが厳密にエラー チェックされているため、悪用可能な未定義の動作が不可能になっているということです。言語をコンパイルしたとしても、それは不可能です。これは、何でもできる安全でない API を公開できなかったという意味ではありません。実際、Python の ctypes モジュールを使用すると、同様の動作を作成できるはずですが、偶然にそうするのは非常に困難です。

于 2010-01-17T15:47:54.497 に答える
2

申し訳ありませんが、Pythonの弱点に到達しました。残念ながら、これは仕様によるものであるため、ほとんど何もできません。おそらくあなたはCにとどまるべきです。

Martinv.Löwisが言ったように:

Pythonはバッファオーバーフローをサポートしていません。申し訳ありません。

PSうわー。その投稿を読んだのは数ヶ月前のようですが、それでも7年1日が経ちました。

于 2010-01-17T22:26:30.013 に答える
2

PHP はスクリプト言語であり、ポインターがなく、文字列型がバイナリセーフであるため、PHP ではこのようなことは機能しません。

しかし、なぜそのようなことをしたいのですか?

(ああ、バッファ オーバーフローを引き起こす PHP のバグがあるかもしれませんが、それは決して信頼できるものではなく、通常はすぐに修正されます...)

于 2010-01-17T14:29:46.563 に答える
1

PHP で同様のことを行っても、同じ動作にはなりません。

PHP は解釈され、実行中の操作が有効かどうかを常にチェックします。したがって、たとえばバッファをオーバーランすることはできません。

于 2010-01-17T14:30:38.267 に答える
1

PHP、Python、およびすべてのインタープリター言語は最初にインタープリターを通過する必要があり、メモリに完全にアクセスできないため、この種の言語では、投稿したコードのようなゲームを実行できません。

于 2010-01-17T14:38:36.157 に答える