这种将 char 数组转换为函数的调用有何作用?
What does this invocation of a char array cast as a function do?
我遇到了这段代码:
char code[] = "\xb0\x01\x31\xdb\xcd\x80";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
复制自Writing Shellcode for Linux and Windows Tutorial。
谁能解释一下这个函数调用 (int)(*func)();
在做什么?
它调用了一个机器代码在数组code
中的函数。 string 包含一些机器级指令((我认为是三个,看看 x86 指令集)。func
被声明为指向不带参数的函数的指针和 returns 一个 int
。然后 func
被设置为那个 string 的第一个字节的地址(机器指令记得)。然后 func
被调用,因此对 字符串 的第一条指令进行了函数调用。
我现在对x86指令集不太了解,不过好像是系统调用(不知道是哪个); 0xcd 0x80
是系统的陷阱。
正如@eteranger所说,它是对_exit
系统调用的调用。
注意这是 Linux 相关的,参见 What does "int 0x80" mean in assembly code?
此处提供了此机制的简短说明:http://www.linfo.org/system_call_number.html
我遇到了这段代码:
char code[] = "\xb0\x01\x31\xdb\xcd\x80";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
复制自Writing Shellcode for Linux and Windows Tutorial。
谁能解释一下这个函数调用 (int)(*func)();
在做什么?
它调用了一个机器代码在数组code
中的函数。 string 包含一些机器级指令((我认为是三个,看看 x86 指令集)。func
被声明为指向不带参数的函数的指针和 returns 一个 int
。然后 func
被设置为那个 string 的第一个字节的地址(机器指令记得)。然后 func
被调用,因此对 字符串 的第一条指令进行了函数调用。
我现在对x86指令集不太了解,不过好像是系统调用(不知道是哪个); 0xcd 0x80
是系统的陷阱。
正如@eteranger所说,它是对_exit
系统调用的调用。
注意这是 Linux 相关的,参见 What does "int 0x80" mean in assembly code?
此处提供了此机制的简短说明:http://www.linfo.org/system_call_number.html