此代码编写于C:
int main(){
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void* addr=0;
addr=&Demoshellcode[0];
__asm call addr
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们还可以将它视为标准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();
}
Run Code Online (Sandbox Code Playgroud)
我实际上并不知道上述行为是否符合任何实现的要求.在现代系统中,您必须处理NX位(允许对内存进行标记,以便无法执行存储在该内存中的指令).
(将对象指针转换为函数指针是对C++ 03的扩展,但C++ 11将其添加为有条件支持的功能.)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |