|
本帖最后由 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 |
评分=感恩!简单却充满爱!感谢您的作品! |
查看全部评分
|