【问题标题】:running shellcode + vs2010运行shellcode + vs2010
【发布时间】:2011-10-15 07:29:19
【问题描述】:

我刚刚尝试了以下代码 sn-p 用于 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 ==========

有什么明显的我做错了吗?

【问题讨论】:

    标签: c++ visual-studio visual-c++ shellcode


    【解决方案1】:

    要使用 VS 在 C/C++ 程序中执行 shellcode,最简单的方法是嵌入汇编代码,如下例所示:

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

    希望对您有所帮助!

    【讨论】:

    • 访问冲突执行位置
    【解决方案2】:

    [
    在我回答问题的时候,是关于为什么编译失败……

    #include<iostream>
    
    using namespace std;
    
    char sc[] = ""; #i've removed the shellcode
    int main() {
        int (*func)();
        func = (int(*)())sc;
        (int)(*func)();
    }
    

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

    使用void* 作为中介,您可能会成功。

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

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

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

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

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

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

    干杯,

    【讨论】:

    • 谢谢,但不,我没有尝试执行 shellscript。我的意思是像“\x90\x90\x90”之类的“操作码”。
    【解决方案3】:

    我认为以下应该可行:

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

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

    【讨论】:

      【解决方案4】:

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

      func = (int(*)())&sc;
      

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-19
        相关资源
        最近更新 更多