免杀专题(一)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
	}

从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.
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值