| 
 | 
			
 
 本帖最后由 Mrack 于 2015-7-25 20:11 编辑  
 
                                   ShellCode技术研究 
这几天在玩Shellcode,即兴就写了篇文章.除了介绍,其他都是我一字一字打出来的. 如有错误请大神们指教.小菜刚刚玩。 排版不好排。、。 
 
介绍:Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握编写技术就显得尤为重要。 
大概过程:一、获取Kernel32.dll的基地址 
二、枚举GetProcAddress 
三、用GetProcAddress获取各种函数的地址.调用各种函数 
编写ShellCode中用到的知识点:了解PE结构,懂C或者Asm 
 
详细过程:获取Kernel32.dll的基地址 
mov eax,fs:[30]               ;获取PEB结构 
mov eax,[eax+c]              ;PEB_LDR_DATA结构 
mov eax,[eax+1c]             ;取LDR_DATA_TABLE_ENTRY结构 
mov eax,[eax]                ;取下一个(Ntdll.dll) 
mov eax,[eax]                ;取下一个(Kernel32.dll)   
mov eax,[eax+8]              ;取DllBase 
  |   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,计算函数地址. 
PUSH EAX 
MOV EAX,[EAX+3C]        ;Nt_Header 
MOV EBX,[ESP] 
MOV EBX,[EAX+EBX+78]   ;输出表地址 偏移 
POP EAX 
LEA EBX,[EAX+EBX]        ;ebx=输出表地址 
MOV ECX,[EBX+18]        ;NumberOfNames 
MOV EDX,[EBX+20]        ;AddressOfNames 
ADD EDX,EAX 
MOV EDI,[EBX+10]        ;Base 
Start: 
MOV ESI,[EDX+EDI*4]      ;枚举函数名地址 
ADD ESI,EAX 
CMP DWORD PTR [ESI],50746547 ;GetP 
JNZ Next 
CMP DWORD PTR [ESI+4],41636F72 ;rocA 
JNZ Next 
CMP DWORD PTR [ESI+8],65726464 ;ddre 
JNZ Next 
CMP WORD PTR [ESI+C],7373       ;ss 
JNZ Next 
JMPFinish 
Next: 
INC EDI 
CMP EDI,ECX 
JNZStart 
Finish: 
MOV EDX,[EBX+24]                ;AddressOfNameOrdinals 
ADD EDX,EAX 
MOV DI,[EDX+EDI*2]              ;读序号表值 
MOV EDX,[EBX+1C]                ;AddressOfFunctions 
ADD EDX,EAX 
MOV ESI,[EDX+EDI*4]             ;函数RVA 
ADD ESI,EAX 
 |  
  
 
 
用GetProcAddress获取各种函数的地址.调用各种函数 
1.下面用的例子是调用个MessageBoxA 
2.首先用GetProcAddress获取GetModuelhandle函数地址 
3.再使用GetModuelhandle获取user32.dll的模块基地址 
4.然后GetProcAddress获取MessageBoxA 
 
 
PUSH 0                   ;释放空间,可以使用sub esp 
PUSH 0 
PUSH 0 
PUSH 0 
PUSH 0 
MOV DWORD PTR [ESP],4D746547  ;填充数据 
MOV DWORD PTR [ESP+4],6C75646F 
MOV DWORD PTR [ESP+8],6E614865 
MOV DWORD PTR [ESP+C],41656C64 ;GetModuelhandle 
MOV EDI,EAX 
PUSH ESP                        ;lpProcName 
PUSH EDI                        ;hModule 
CALL ESI                        ;GetProcAddress 
ADD ESP,14 
PUSH EAX                       ;保存GetModuelhandle 
PUSH 0 
PUSH 0 
PUSH 0 
PUSH 0 
MOV DWORD PTR [ESP],72657375 
MOV DWORD PTR [ESP+4],642E3233 
MOV DWORD PTR [ESP+8],6C6C  ;user32.dll 
PUSH ESP 
CALL [ESP+14] 
ADD ESP,10                     ;记得要维护平衡 
PUSH 0 
PUSH 0 
PUSH 0 
PUSH 0 
MOV DWORD PTR [ESP],7373654D 
MOV DWORD PTR [ESP+4],42656761 
MOV DWORD PTR [ESP+8],41786F  ;MessageBoxA 
PUSH ESP                      ;ESP做参数的指针用 
PUSH EAX                     ;user32.dll hModule 
CALL ESI                      ;GetProcAddress 
ADD ESP,10 
PUSH 0 
PUSH 0 
PUSH 0 
PUSH 0 
MOV DWORD PTR [ESP],6361724D     
MOV DWORD PTR [ESP+4],6853206B 
MOV DWORD PTR [ESP+8],636C6C65 
MOV DWORD PTR [ESP+C],65646F         ;Mrack Shellcode 
PUSH 0 
LEA EDX,[ESP+4]                        ;由于Push 0 了改变了ESP的值.故ESP+4 
PUSH EDX 
PUSH EDX 
PUSH 0 
CALL EAX                              ;调用MessageBoxA 
ADD ESP,14 
 
 |   易语言/ASM 源码与PDF版: 
 
 
 
 |   
 
评分
- 
|  参与人数 12 | 威望 +1 | 
HB +45 | 
THX +10 | 
收起
理由
 | 
 
| 
DDK4282
 |  | 
 + 1 | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意! | 
 
| 
消逝的过去
 |  | 
 | 
 + 1 | 
 | 
 
| 
zxjzzh
 |  | 
 | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! | 
 
| 
agan8888
 |  | 
 | 
 + 1 | 
 | 
 
| 
playboy
 |  | 
 + 1 | 
 | 
 | 
 
| 
2323816
 |  | 
 | 
 + 1 | 
 | 
 
| 
VSsavitar
 |  | 
 + 1 | 
 | 
[快捷评语] - 软件带有“学破解论坛网址”,置顶高亮7天7夜! | 
 
| 
Shark恒
 |  + 1 | 
 + 10 | 
 + 1 | 
流畅的思路, Mrack霸气! | 
 
| 
Honey丶Crack
 |  | 
 + 6 | 
 + 1 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
| 
童真丶
 |  | 
 + 6 | 
 + 1 | 
Mrack 师父好腻害! | 
 
| 
虚竹
 |  | 
 + 10 | 
 + 1 | 
师傅还是这么牛逼! | 
 
| 
LCC
 |  | 
 + 10 | 
 + 1 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
 
查看全部评分
 
 
 
 
 
 |