赞
踩
一段16进制的机器码,可在暂存器eip溢出后,塞入一段可让cpu执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
因为shellcode一般为一段汇编代码,不依赖任何编译环境,也不能像编写代码一样,调用api函数名称来实现功能。它通过主动查找dll基址并动态获取api地址的方式来实现api调用。
Kernel32.dll控制着系统的内存管理、数据的输入输出操作和中断处理。
shellcode分为两个模块,基本模块和功能模块
用于实现shellcode初始运行、获取kernel32基址和获取api地址的过程。
常见方法有暴力搜索、异常处理链表搜索和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.dll
do
{
PVOID BaseAddre
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。