1

シェルコードのテスト目的で、次のコード スニペットを試してみました。

#include<iostream>

using namespace std;

char sc[] = ""; #i've removed the shellcode
int main() {
    int (*func)();
    func = (int(*)())sc;
    (int)(*func)();
}

コンパイル時にビルドエラーが発生します:-

------ Build started: Project: shellcoderunner, Configuration: Debug Win32 ------
Build started 10/15/2011 12:51:16 PM.
InitializeBuildStatus:
  Touching "Debug\shellcoderunner.unsuccessfulbuild".
ClCompile:
  blah.cpp
c:\users\reverser\documents\visual studio 2010\projects\shellcoderunner\shellcoderunner\blah.cpp(7): error C2440: 'type cast' : cannot convert from 'char [149]' to 'int (__cdecl *)(void)'
          There is no context in which this conversion is possible

Build FAILED.

Time Elapsed 00:00:01.99
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

私が間違っていることは明らかですか?

4

4 に答える 4

2

VS を使用して C/C++ プログラムでシェルコードを実行するには、次の例のようにアセンブリ コードを埋め込むのが最も簡単な方法です。

char* buffer="blah blah blah";
int main() {
    __asm{
        lea eax, buffer
        call    eax
    }
}

この助けを願っています!

于 2012-10-17T04:11:57.120 に答える
1

配列を関数ポインターにキャストすることはできません。最初に配列へのポインターを取得する必要があります。これはキャストできます。

func = (int(*)())&sc;
于 2011-10-15T09:58:07.267 に答える
1

私は以下がうまくいくはずだと思います:

char sc[] = ""; // i've removed the shellcode

int main()
{
    int (*func)() = (int(*)())sc;   // C++
    int (*func)() = sc;             /* C  */
    func();
}

これは技術的に未定義の動作ですが、シェルコードの要点です。

于 2011-10-15T09:50:14.167 に答える
1

[
私が質問に答えている時点で、なぜコンパイルが失敗するのかについてです...

#include<iostream>

using namespace std;

char sc[] = ""; #i've removed the shellcode
int main() {
    int (*func)();
    func = (int(*)())sc;
    (int)(*func)();
}

このコードは、データ バイトをマシン コードとして実行しようとする試みです。ただし、OP はこれを「シェルコード テスト用のコード スニペット」と呼びますが、これは無関係です。ですから、この元のコンテキストを含めています。
]

void*を仲介として使用すると成功する場合があります。

フォーマルでは、データ ポインターを関数ポインターに、またはその逆に変換できないため、コンパイルしないでください。

ただし、伝えられるところによると、Posix はその変換を実行する機能を必要とし、それは既存の古い慣行であるため、すべてのコンパイラではないにしてもほとんどのコンパイラがそれをサポートしていると思います。

効果に関しては、UB ランドにいることに注意してください。

また、ウイルス対策ソフトウェアとページレベルの実行許可チェックは、文字列内のバイトをマシンコードとして実行しようとすることに少し同意しない可能性があることに注意してください。そのため、そのより高いレベルでは、明らかに間違ったことをしています。;-)

ところで、達成しようとしているのがシェルスクリプトを実行することである場合は、system関数を調べてください。

呼び出しで渡すコマンドはsystemシステムによって異なるため、質問を変更する場合は、それに関する情報を必ず含めてください。

乾杯 & hth.,

于 2011-10-15T07:59:55.920 に答える