ShellCode技术研究

这几天在玩Shellcode,即兴就写了篇文章.除了介绍,其他都是我一字一字打出来的.

源代码下载地址:
链接: http://pan.baidu.com/s/1eQyav54 密码: bihc

PDF高清版:

链接: http://pan.baidu.com/s/1gdIrgen 密码: ecxg


如有错误请大神们指教

By:Mrack



 介绍:

Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握编写技术就显得尤为重要。

 大概过程: 

  • 获取Kernel32.dll的基地址

  • 枚举GetProcAddress

  • 用GetProcAddress获取各种函数的地址.调用各种函数

 编写ShellCode中用到的知识点:

了解PE结构,懂C或者Asm


 详细过程: 获取Kernel32.dll的基地址


PEB结构:

typedef struct _PEB {

BYTE                          Reserved1[2];
BYTE                          BeingDebugged;
BYTE                          Reserved2[1];
PVOID                         Reserved3[2];
PPEB_LDR_DATA                 Ldr;    //指向PEB_LDR_DATA结构
PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
BYTE                          Reserved4[104];
PVOID                         Reserved5[52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE                          Reserved6[128];
PVOID                         Reserved7[1];
ULONG                         SessionId;
} PEB, *PPEB;

 PEB_LDR_DATA: 
typedef struct _PEB_LDR_DATA { 

BYTE       Reserved1[8];
PVOID      Reserved2[3];
LIST_ENTRY InMemoryOrderModuleList;      //LDR_DATA_TABLE_ENTRY
} PEB_LDR_DATA, *PPEB_LDR_DATA;

LDR_DATA_TABLE_ENTRY:

typedef struct _LDR_DATA_TABLE_ENTRY {
PVOID Reserved1[2];
LIST_ENTRY InMemoryOrderLinks;
PVOID Reserved2[2];
PVOID DllBase; //加载的DLL的基址
PVOID EntryPoint;
PVOID Reserved3;
UNICODE_STRING FullDllName;
BYTE Reserved4[8];
PVOID Reserved5[3];
union {
ULONG CheckSum;
PVOID Reserved6;
};
ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

 

 枚举GetProcAddress

 

首先我们得找到Nt_Header再通过这个获取输出表,枚举AddressOfNames,判断是否是GetProcAddress,然后读取AddressOfFunctions,获取RVA,计算函数地址.

 

 

 

 用GetProcAddress获取各种函数的地址.调用各种函数

 

  1. 下面用的例子是调用个MessageBoxA

  2. 首先用GetProcAddress获取GetModuelhandle函数地址

  3. 再使用GetModuelhandle获取dll的模块基地址

  4. 然后GetProcAddress获取MessageBoxA

 

 



评论
©Mrack | Powered by LOFTER