热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python写shellcode,shellcode什么意思

每甜美的裙子听到ShellCode一定会想到病毒与安全。其实ShellCode并没有你想想中的那么难,它有一个特点就是把它嵌入到任何进程中都能够运行。是不是感觉很牛逼。但是我们分析

每甜美的裙子听到ShellCode一定会想到病毒与安全。其实ShellCode并没有你想想中的那么难,它有一个特点就是把它嵌入到任何进程中都能够运行。是不是感觉很牛逼。但是我们分析一下什么代码能够不依赖任何环境呢?首先这段代码不能够有常量区、静态区数据。也就是说不能够有全局变量。还有不能有类似char str[]={"hello word"};这样的数据,因为这样的数据在常量区。同时不能够有系统调用和函数调用。甜美的裙子代码包含以上这些条件。那么恭喜你已经完成了一个ShellCode。下面我们就简单分析一个windows下弹Messagebox这段代码如何书写。

首先需要获取到KERNEL32.DLL的基地址。我们可以用以下两种方法,其原理都是一样的,我希望你和我一样想知道为什么这么写,那么我们来探究为什么这样写。

_asm{MOV EAX, DWORD PTR FS : [0x30]//; 获取PEB基址MOV EAX, DWORD PTR DS : [EAX + 0xC]//; 获取PEB_LDR_DATA结构指针MOV ESI, DWORD PTR DS : [EAX + 0x1C]//; 获取InInitializationOrderModuleList成员指针LODS DWORD PTR DS : [ESI]//; 把ESI地址里的值给EAX,同时ESI自己加4,相当于获取下一个节点MOV EBX, DWORD PTR DS : [EAX + 8]//; 取其基地址,该结构当前包含的是kernel32.dllMOV dwKernelBase, EBX}_asm{mov eax, DWORD PTR FS:[0x30]//+0x030 ProcessEnvironmentBlock : Ptr32 _PEB*mov eax, DWORD PTR DS:[eax + 0x0c]// +0x00c Ldr : Ptr32 _PEB_LDR_DATA *mov eax, DWORD PTR DS:[eax + 0x1c]// +0x01c InInitializationOrderModuleList : _LIST_ENTRYmov pBEG, eax //pBEG自己定义的PVOIDmov eax, [eax]//地址里的值指向下一个mov pPLD, eax //pPLD自己定义的PVOID}//遍历找到kernel32.dlldo{PVOID BaseAddress = (PVOID)*((PDWORD)((DWORD)pPLD + 0x08));PVOID FullDllName = (PVOID)*((PDWORD)((DWORD)pPLD + 0x20));WCHAR* szname = (WCHAR*)FullDllName;pLast = (WORD *)FullDllName;pFirst = (WORD *)szKernel32;while (*pFirst && *pFirst == *pLast){pFirst++;pLast++;}if (*pFirst == *pLast){dwKernelBase = (DWORD)BaseAddress;break;}pPLD = (PVOID)*((PDWORD)pPLD);} while (pPLD != pBEG);

要想理解上面的代码就要知道FS:[0] 相当于基地址为当前线程的线程环境块(TEB),所以该段也被称为TEB段。下面就是TEB的结构体

/*
cefclient!_TEB
   +0x000 NtTib            : _NT_TIB
   +0x01c EnvironmentPointer : Ptr32 Void
   +0x020 ClientId         : _CLIENT_ID
   +0x028 ActiveRpcHandle  : Ptr32 Void
   +0x02c ThreadLocalStoragePointer : Ptr32 Void
   +0x030 ProcessEnvironmentBlock : Ptr32 _PEB//进程环境块 PEB
   +0x034 LastErrorValue   : Uint4B
   +0x038 CountOfOwnedCriticalSections : Uint4B
   +0x03c CsrClientThread  : Ptr32 Void
   +0x040 Win32ThreadInfo  : Ptr32 Void

*/

我们看到了PEB在偏移0x30的位置所以你很好理解 mov eax, DWORD PTR FS:[0x30]这句汇编了吧。

/*
cefclient!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 BitField         : UChar
   +0x003 ImageUsesLargePages : Pos 0, 1 Bit
   +0x003 IsProtectedProcess : Pos 1, 1 Bit
   +0x003 IsImageDynamicallyRelocated : Pos 2, 1 Bit
   +0x003 SkipPatchingUser32Forwarders : Pos 3, 1 Bit
   +0x003 IsPackagedProcess : Pos 4, 1 Bit
   +0x003 IsAppContainer   : Pos 5, 1 Bit
   +0x003 IsProtectedProcessLight : Pos 6, 1 Bit
   +0x003 SpareBits        : Pos 7, 1 Bit
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA //进程加载的模块链表Ldr
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   +0x018 ProcessHeap      : Ptr32 Void
   +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION
   +0x020 AtlThunkSListPtr : Ptr32 Void
   +0x024 IFEOKey          : Ptr32 Void
   +0x028 CrossProcessFlags : Uint4B

*/

这下我们理解了mov eax, DWORD PTR DS:[eax + 0x0c]//   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA *

/*
cefclient!_PEB_LDR_DATA
   +0x000 Length           : Uint4B
   +0x004 Initialized      : UChar
   +0x008 SsHandle         : Ptr32 Void
   +0x00c InLoadOrderModuleList : _LIST_ENTRY 
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY//获取初始化顺序模块链表
   +0x024 EntryInProgress  : Ptr32 Void
   +0x028 ShutdownInProgress : UChar
   +0x02c ShutdownThreadId : Ptr32 Void
*/

对应mov eax, DWORD PTR DS:[eax + 0x1c]//  +0x01c InInitializationOrderModuleList : _LIST_ENTRY

下面我们来看看

mov pBEG, eax //首先用pBEG保存第一个链表的地址
mov eax, [eax]//地址里的值指向下一个

mov pPLD, eax//pPLD保存下一个指向的地址

这是一张我在网上找到的图 感觉很形象理解上面的结构体


但是我们是在第三个list做的选着下一个节点。所以这个图有一些问题,但是原理是一样的。是不是知道我们如何找到KERNEL32.DLL的基地址了。我推荐使用第二种方法查找基地址。第一中在win7以上系统才可以。第二种通过对比字符串确定基地址更为准确一些。

我们已经找到了KERNEL32.DLL的基地址了,下面如何找到GetProcAddress函数地址了。这需要你对PE文件有一些了解。知道导出表在那个位置。代码如下

IMAGE_DOS_HEADER *pIDH = (IMAGE_DOS_HEADER*)dwKernelBase;//获取基地址DOS头IMAGE_NT_HEADERS *pINGS = (IMAGE_NT_HEADERS*)((DWORD)dwKernelBase + pIDH->e_lfanew);//找到NT头IMAGE_EXPORT_DIRECTORY *pIED = (IMAGE_EXPORT_DIRECTORY*)((DWORD)dwKernelBase + pINGS->OptionalHeader.DataDirectory[0].VirtualAddress);//找到导出表位置DWORD *pAddOffun_Raw = (DWORD*)((DWORD)dwKernelBase + pIED->AddressOfFunctions);//导出表对应的三个地址,他们之间多关系我就不讲了自己查看导出表WORD *pAddOfOrd_Raw = (WORD*)((DWORD)dwKernelBase + pIED->AddressOfNameOrdinals);DWORD *pAddOfofNames_Raw = (DWORD*)((DWORD)dwKernelBase + pIED->AddressOfNames);

下面我们要获取具体GetProcAddress函数地址

// PE(导出表)->找导出函数for (;dwCntNumberOfNames;dwCnt++){pFinded = (char*)((DWORD)dwKernelBase + pAddOfofNames_Raw[dwCnt]);//名称表对应多名称地址while (*pFinded && *pFinded == *pSrc)//对比GetProcAddress字符串{pFinded++;pSrc++;}if (*pFinded == *pSrc)//对比成功{pGetProcAddress = (PGETPROCADDRESS)((DWORD)dwKernelBase + pAddOffun_Raw[pAddOfOrd_Raw[dwCnt]]);//名称表对应序号表地址里的内容就是对应多函数地址break;}pSrc = szGetProcAddr;}

这样我们就找到了GetProcAddress函数地址,有了这个函数地址我们就可以获取任意我们想加载的函数了

//获取其他函数地址pLoadLibrary = (PLOADLIBRARY)pGetProcAddress((HMODULE)dwKernelBase, szLoadLibrary);pMessageBox = (PMESSAGEBOX)pGetProcAddress((HMODULE)pLoadLibrary((LPCTSTR)szUser32), szMessageBox);char strtest[] = { 'S','h','e','l','l','C','o','d','e',0 };char strContent[] = { 'l','i','u','g','x',0 };pMessageBox(NULL, (LPCTSTR)strtest, (LPCTSTR)strContent, 0);这样我们调用成功MessageBox函数了。甜美的裙子把上面一段代码转成硬编码,之后就可以嵌入其他进程中运行了。







推荐阅读
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Win10 周年更新 14393.1737 的详细内容与改进
    尽管今天不是常规的周二补丁日,微软依然发布了 Win10 周年更新 14393.1737 和 Win10 创意者更新 15063.632。本文将详细介绍 Win10 周年更新 14393.1737 的主要更新内容。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
author-avatar
手机用户2602907485
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有