このコードは次のように書かれていC
ます:
int main(){
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void* addr=0;
addr=&Demoshellcode[0];
__asm call addr
return 0;
}
C++
標準コードとしても考えられますか?C++
そうでない場合、標準コードとして作成するにはどのような変更が必要ですか?
このコードは次のように書かれていC
ます:
int main(){
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void* addr=0;
addr=&Demoshellcode[0];
__asm call addr
return 0;
}
C++
標準コードとしても考えられますか?C++
そうでない場合、標準コードとして作成するにはどのような変更が必要ですか?
拡張機能を除外するために「標準」を使用しますが、実装で定義された動作(とにかく回避することはほとんど不可能です)または条件付きでサポートされる機能は除外します。
__asm
いいえ、拡張機能であるため、この例は標準ではありません。標準asm(...)
(実装定義の動作)を使用する必要がありますが、VC++はをサポートしていませんasm()
。
ポインターを関数ポインター(実装定義の動作を備えたC ++ 11で条件付きでサポートされている)に変換して呼び出すこともできます。
int main() {
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void (*func_ptr)(void) = reinterpret_cast<void (*)(void)>(&Demoshellcode);
func_ptr();
}
上記がどの実装でも希望どおりに動作するかどうかは実際にはわかりません。最近のシステムでは、NXビットを処理する必要があります(これにより、メモリに格納されている命令を実行できないようにメモリにマークを付けることができます)。
(オブジェクトポインタを関数ポインタに変換することはC ++ 03の拡張でしたが、C ++ 11は条件付きでサポートされる機能として追加しました。)
そうで__asm
はなく、標準ではありません。
asm
ただし、です。
また、実装定義であることに注意してください。
asm宣言の形式は
asm-definition:
asm ( string-literal ) ;
asm宣言は条件付きでサポートされています。その意味は実装定義です。[注:通常、実装を介してアセンブラーに情報を渡すために使用されます。—エンドノート]