当前位置:   article > 正文

免杀专题(一)shellcode原理

shellcode原理

免杀专题(一)shellcode原理

基本概念

一段16进制的机器码,可在暂存器eip溢出后,塞入一段可让cpu执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

原理

因为shellcode一般为一段汇编代码,不依赖任何编译环境,也不能像编写代码一样,调用api函数名称来实现功能。它通过主动查找dll基址并动态获取api地址的方式来实现api调用。

在这里插入图片描述

Kernel32.dll控制着系统的内存管理、数据的输入输出操作和中断处理。

shellcode分为两个模块,基本模块和功能模块

基本模块

用于实现shellcode初始运行、获取kernel32基址和获取api地址的过程。

获取kernel32基址

常见方法有暴力搜索、异常处理链表搜索和TEB搜索。

这里说一下TEB搜索

在这里插入图片描述

原理

在NT内核系统中, fs 寄存器指向TEB结构, TEB+0x30偏移处指向PEB ( Process EnvironmentBlock )结构,PEB+0x0c偏移处指向PEB LDR DATA结构, PEB LDR_ DATA+0xlc 偏移处存放着程序加载的动态链接库地址,第1个指向Ndl.dII, 第2个就是Kerel32.dl的基地址。

_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.dll
		MOV dwKernelBase, EBX
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

从Windows Vista 开始,程序中DLL基址的加载顺序发生了变化,在固定的位置已经不能得到正确的Kernel32 基址了,因此,需要在列表中对各DLL模块的名称加以判断,才能得到正确的Kernel32基址。

_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_ENTRY
		mov pBEG, eax ;pBEG自己定义的PVOID
		mov eax, [eax];地址里的值指向下一个
		mov pPLD, eax ;pPLD自己定义的PVOID
	}
;遍历找到kernel32.dll
do
{
	PVOID BaseAddre
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/705369
推荐阅读
  

闽ICP备14008679号