【问题标题】:C code explanationC代码解释
【发布时间】:2013-07-13 23:32:39
【问题描述】:

谁能帮我解释一下这几行代码?

char code[] = "paste your shellcode here";

int main(int argc, char **argv)
{
   int (*func)();
   func = (int (*)()) code;
   (int)(*func)();
}

【问题讨论】:

  • 注意:1.C99下无法编译; 2. 在最后一行转换为int 是多余的,(*func)(); 就足够了

标签: c shellcode


【解决方案1】:

您在此处的代码是一个示例,说明如何创建指向任意数据片的函数指针,然后调用它。

在一个非常简单的意义上,我们分配了一个字节数组 (char []),二进制 shellcode 有效负载被粘贴到其中,通常作为转义的十六进制值。

int (*func)(); 这一行声明了一个返回整数的函数指针。这是典型的,因为大多数代码都会在 EAX 中返回某种基于整数的退出代码。

这一行,func = (int (*)()) code; 将字节数组代码转换为函数指针,并将其分配给先前定义的函数指针 'func'。

(int)(*func)(); 这一行实际上调用了 shellcode,将执行转移到字节数组中的第一个内存位置。

这段代码实际上非常有用。您不会期望发现它用于利用系统;相反,此代码用于在开发过程中测试、调试和以其他方式试验 shellcode。使用它,您可以简单地粘贴您尝试测试的 shellcode,然后执行它。这使您的 shellcode 保持非常简单,排除了完整独立可执行文件的所有典型要求,但仍允许您对其进行测试,而无需确定要利用的漏洞。通过这种方式,您可以知道代码是否有效,而不会被尝试利用实际代码时出现的各种干扰。

【讨论】:

  • 谢谢大卫,但是为什么所有的东西都被声明为指针呢?首先我们声明了函数指针而不是普通函数。其次将数组作为另一个函数指针,然后将其分配给第一个函数指针!我只是对所有这些指针感到困惑:)
  • 必须将其声明为函数指针的原因是因为我们不允许 C 创建函数 prolog/epilog。相反,我们将(函数指针)指向内存中的任意位置(字节数组)并告诉编译器,“相信我,如果你跳转到它那里会有可执行代码。”
  • @DavidHoelzer 为什么我们不允许 C 创建新的 pro/epilog?
  • 请记住,此 C 代码旨在让您测试 shellcode。我希望它完全按原样运行,没有添加或更改任何内容。此外,最终,即使我创建了一个实际的函数,我将如何将此二进制有效负载嵌入到该函数的主体中?最终,函数指针将是必要的。使用内联汇编将一串已定义的字节链接在一起会感觉非常混乱。
  • @DavidHoelzer 我会建议内联汇编,哈哈。我同意你的看法,但是为了讨论; shellcode是否用pro/epilog“填充”真的很重要吗?除了负载大小明显不必要的增加。
【解决方案2】:

您是否尝试过在 Google 上搜索 "paste your shellcode here"?返回的 first 第二个(现在这个问题是第一个 LOL)结果是 Corelan Team's Exploit writing tutorial part 9: Introduction to Win32 shellcoding 全部解释:

简而言之,它只是一个用于测试 shellcode 的小型实用 C 应用程序,稍后将在本教程的后续部分中用于此目的。其余的在教程中解释。

【讨论】:

  • 其实我已经从这篇文章中学习了shellcoding,需要了解一下!所以我只是从那里复制了它。
  • 好的……知道了。我会在下一篇文章中做!
  • 确实是逐行讨论,但确实感觉这在小组之间摇摆不定。这似乎可以适合这里或堆栈溢出或逆向工程...只要我的 2 美分。 :)
  • 有道理。 :) 我只知道在很难找到发布问题的最佳位置时将问题杀死是多么令人沮丧。 :)
猜你喜欢
  • 2013-08-24
  • 2014-11-14
  • 2013-10-14
  • 2011-06-25
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多