1

我刚刚尝试了以下代码片段来进行 shellcode 测试:-

#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++ 程序中执行 shellcode,最简单的方法是嵌入汇编代码,如下例所示:

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

希望这有帮助!

于 2012-10-17T04:11:57.120 回答
1

[
当时我正在回答这个问题是关于为什么编译失败......

#include<iostream>

using namespace std;

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

此代码尝试将数据字节作为机器代码执行。但是,OP 将此称为“用于 shellcode 测试目的的代码片段”,这是不相关的。因此,我将这个原始上下文包括在内。
]

使用 avoid*作为中介,您可能会取得成功。

在形式中甚至不应该编译,因为在形式中数据指针不能转换为函数指针,反之亦然。

然而,据报道,Posix 需要进行这种转换的能力,而且它是旧的现有做法,所以我相信大多数(如果不是所有)编译器都支持它。

请注意,就效果而言,您处于 UB 领域。

另外,请注意,防病毒软件和页面级别的执行权限检查可能与尝试将字符串中的字节作为机器代码执行有些不同,所以在更高的级别上,是的,您正在做一些明显错误的事情。;-)

顺便说一句,如果你想要实现的是执行一个 shell 脚本,那么看看这个system函数。

在调用中传递什么命令system取决于您的系统,因此如果您更改问题,请务必包含有关该信息的信息。

干杯&hth.,

于 2011-10-15T07:59:55.920 回答
1

我认为以下应该有效:

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

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

这在技术上是未定义的行为,但这又是 shellcode 的全部意义所在。

于 2011-10-15T09:50:14.167 回答
1

您不能将数组转换为函数指针。您必须首先获取指向数组的指针,然后可以对其进行强制转换:

func = (int(*)())&sc;
于 2011-10-15T09:58:07.267 回答