首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从exe生成Shellcode?

从exe生成Shellcode?
EN

Stack Overflow用户
提问于 2016-07-02 15:42:50
回答 2查看 12K关注 0票数 2

因此,最近我一直在学习低级编程语言(比如程序集,据我理解它只是符号二进制语言),并遇到了such编码(例如“\X4D.”)。等)。我发现您可以将Shellcode输入到C/C++应用程序中,然后执行它--我的问题是,可以从现有的exe应用程序生成Shellcode,然后在C/C++应用程序中使用生成的Shellcode吗?我是否误解了谢尔编码的可能性?非常感谢-一个在低水平编程方面知识非常有限的人。

EN

回答 2

Stack Overflow用户

发布于 2016-07-02 16:40:46

是否可以从现有的exe应用程序生成Shellcode,然后在C/C++应用程序中使用生成的Shellcode?

答:没有。Shellcode是基本独立的,可执行PE文件有大量的头文件,等等,您不能在执行某些操作/之前执行它。

谢勒码-这是个很大的问题。

首先,您需要知道外部库(如kernel32、user32库等)的函数嵌入存储在中,该表在启动时由windows-加载程序填充。所有的内存工作都是通过地址来完成的,即编译阶段的计算。所以你得自己找地址。

要从shellcode代码调用函数,您必须有自己的函数地址加载程序。此加载程序必须加载内核32.dll库,搜索GetProcAddress函数并填充

你不知道你的外壳代码将被加载的地址,你可以从这样的代码中知道它,称为“增量偏移”。

代码语言:javascript
运行
复制
call    delta
 delta:
pop     ebp
sub     ebp,offset delta

现在,在ebp中,将偏移量加到实地址,因此要获得函数地址的变量,需要加上偏移量,例如:

代码语言:javascript
运行
复制
lea eax, [variable]
add eax, ebp; adding a delta-offset
mov ecx, dword ptr DS:[eax]

要编译代码供将来使用,您应该使用类似FASM的代码,在编译后使用WinHex编辑器-> ->复制所有-> GREP C源代码

您将得到类似于"\x00\x28“之类的内容,要调用它,需要为外壳代码数组设置执行权限,并通过命令处理程序(如jmp/ call /etc )更改EIP。

有一个例子显示在Windows,World MessageBox中

代码语言:javascript
运行
复制
# include <stdlib.h>
# include <stdio.h>
# include <string.h>

# include <windows.h>


int
main(void)
{
  char *shellcode = "\x33\xc9\x64\x8b\x49\x30\x8b\x49\x0c\x8b"
    "\x49\x1c\x8b\x59\x08\x8b\x41\x20\x8b\x09"
    "\x80\x78\x0c\x33\x75\xf2\x8b\xeb\x03\x6d"
    "\x3c\x8b\x6d\x78\x03\xeb\x8b\x45\x20\x03"
    "\xc3\x33\xd2\x8b\x34\x90\x03\xf3\x42\x81"
    "\x3e\x47\x65\x74\x50\x75\xf2\x81\x7e\x04"
    "\x72\x6f\x63\x41\x75\xe9\x8b\x75\x24\x03"
    "\xf3\x66\x8b\x14\x56\x8b\x75\x1c\x03\xf3"
    "\x8b\x74\x96\xfc\x03\xf3\x33\xff\x57\x68"
    "\x61\x72\x79\x41\x68\x4c\x69\x62\x72\x68"
    "\x4c\x6f\x61\x64\x54\x53\xff\xd6\x33\xc9"
    "\x57\x66\xb9\x33\x32\x51\x68\x75\x73\x65"
    "\x72\x54\xff\xd0\x57\x68\x6f\x78\x41\x01"
    "\xfe\x4c\x24\x03\x68\x61\x67\x65\x42\x68"
    "\x4d\x65\x73\x73\x54\x50\xff\xd6\x57\x68"
    "\x72\x6c\x64\x21\x68\x6f\x20\x57\x6f\x68"
    "\x48\x65\x6c\x6c\x8b\xcc\x57\x57\x51\x57"
    "\xff\xd0\x57\x68\x65\x73\x73\x01\xfe\x4c"
    "\x24\x03\x68\x50\x72\x6f\x63\x68\x45\x78"
    "\x69\x74\x54\x53\xff\xd6\x57\xff\xd0";

  DWORD why_must_this_variable;
  BOOL ret = VirtualProtect (shellcode, strlen(shellcode),
    PAGE_EXECUTE_READWRITE, &why_must_this_variable);

  if (!ret) {
    printf ("VirtualProtect\n");
    return EXIT_FAILURE;
  }

  printf("strlen(shellcode)=%d\n", strlen(shellcode));

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

  return EXIT_SUCCESS;
}

您可能会寻找RunPE算法。该算法可以在另一个算法中执行PE可执行文件。您正在打开另一个进程,复制部分,填充IAT表,并从新的入口点恢复目标进程.这是一种代码注入技术,使用了我的一个恶意软件。所以我不会解释如何实现它

票数 1
EN

Stack Overflow用户

发布于 2016-07-02 16:54:37

谢尔码是用作利用程序(如缓冲区溢出)的有效负载的机器代码。根据它所使用的漏洞,它可能有限制,例如最大长度,或者不允许某些字节值(例如零)。没有一刀切的答案可以解释外壳代码是什么。

一般情况下,是的,原则上可以在外壳代码中嵌入完整的程序。它可以采取小型包装(可能是手工编写的程序集)的形式,将程序写入一个新的.exe文件,然后运行它,或者使用更复杂的技术来替换内存中的当前程序。可能有自动工具来创建这类外壳代码,尽管我不知道任何具体的工具。

然而,你问题的语气让我觉得你可能误解了一些重要的东西:

我发现可以将Shellcode输入到C/C++应用程序中,然后执行它。

--这是一个bug,而不是一个特性。能够在运行中的程序中注入新代码,这是一个主要的安全缺陷。在过去的几十年里,这类事情一直是许多安全漏洞的根源,开发人员花费了大量的精力来阻止它的发生。

如果有可能向程序中注入外壳代码,程序就会中断。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38161809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档