4

Cプログラムを使用してシェルコードのサンプルを評価することは複雑ではありません。これには、シェルコードを文字配列に格納し、関数ポインターを作成し、ポインターを型キャストして配列を指すようにし、関数(ポインター)を呼び出すことが含まれます。

これは、次の場所でメモリを実行できると仮定した場合の動作ですnastycode[]

/* left harmless. Insert your own working example at your peril */
char nastycode[] = "\x00\x00\x00...";
void (*execute_ptr) (void);

execute_ptr = (void *)nastycode; /* point pointer at nasty code */
execute_ptr();                   /* execute it */

Pythonコードを使用して同じことを行う方法はありますか?それとも、Pythonコードがバイトコードに変換されるという事実は、そのような努力を不可能にしますか?

4

3 に答える 3

4

これを実行できる唯一の方法は、Cライブラリに依存している場合です。バッファオーバーフローは、ライブラリバインディングからPythonに導入できます。目的のために、cで独自の単純なPythonライブラリを記述し、AlephOneのSmashingthe Stack for FunandProfitにexample3.cのようなものを実装することができます。Aviloが指摘したように、NXゾーンについて心配する必要がありますが、メモリの任意の領域を再度実行可能にすることができ、これはプラットフォーム固有です。また、GCCはデフォルトでスタックカナリアを使用します。これは、関数に渡されたアドレスでリターンアドレスを上書きするだけで回避できますが、これにより、缶詰工場はそのまま残ります。ASLRは非常に優れたセキュリティシステムであり、バイパスするのは難しい場合がありますが、既知のアドレスをシェルコードに渡す場合は、ASLRは問題になりません。

于 2011-02-19T20:27:58.023 に答える
1

これはあなたが探しているものです;)

http://libemu.carnivore.it/

あなたがPythonを探しているので:

https://github.com/buffer/pylibemu

于 2014-03-17T20:53:40.017 に答える
0

Pythonで可能です...ctypesを使用してCに独自のバインディングを行うか、単にdistormのようなものを使用できます

http://code.google.com/p/distorm/wiki/Python

また、dionaeaがどのようにそれを行うかを確認することもできます。ハニーポットですが、シェルコードをテストして結果を出力します。

http://dionaea.carnivore.it/

于 2011-09-28T23:14:29.817 に答える