我刚试过以下代码片段用于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 ==========
明显我做错了吗?
答案 0 :(得分:3)
要使用VS在C / C ++程序中执行shellcode,最简单的方法是嵌入汇编代码,如下例所示:
char* buffer="blah blah blah";
int main() {
__asm{
lea eax, buffer
call eax
}
}
希望这有帮助!
答案 1 :(得分:2)
[
当我回答这个问题时,为什么编译失败...
#include<iostream>
using namespace std;
char sc[] = ""; #i've removed the shellcode
int main() {
int (*func)();
func = (int(*)())sc;
(int)(*func)();
}
此代码尝试将数据字节作为机器代码执行。但是,OP称之为“用于shellcode测试目的的代码片段”,这是无关的。所以我将这个原始背景包括在内 ]
使用void*
作为中介可能会取得成功。
在正式中甚至不应该编译,因为在正式的数据指针中无法转换为函数指针,反之亦然。
然而,据报道,Posix需要能够进行转换,这是现有的旧做法,所以我相信大多数编译器都支持它。
请注意,你在UB-land中就效果而言。
另外,请注意反病毒软件和页面级执行权限检查可能会在尝试执行字符串中的字节作为机器代码时有点不同意,所以在更高级别是的,你做的事情显然是错误的。 ; - )
顺便说一句,如果你想要实现的是执行shell脚本,那么请查看system
函数。
system
来电中传递的命令取决于您的系统,因此如果您更改了问题,请务必提供相关信息。
干杯&amp;第h。,
答案 2 :(得分:2)
我认为以下内容应该有效:
char sc[] = ""; // i've removed the shellcode
int main()
{
int (*func)() = (int(*)())sc; // C++
int (*func)() = sc; /* C */
func();
}
这是技术上未定义的行为,但那又是shellcode的重点。
答案 3 :(得分:2)
您无法将数组转换为函数指针。你必须首先获得一个指向数组的指针,然后可以转换为:
func = (int(*)())≻