Mrack 发表于 2015-7-25 20:07

ShellCode技术研究

本帖最后由 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:               ;获取PEB结构
mov eax,            ;PEB_LDR_DATA结构
mov eax,             ;取LDR_DATA_TABLE_ENTRY结构
mov eax,                ;取下一个(Ntdll.dll)
mov eax,                ;取下一个(Kernel32.dll)
mov eax,            ;取DllBase

PEB结构:
typedef struct _PEB {
BYTE                        Reserved1;
BYTE                        BeingDebugged;
BYTE                        Reserved2;
PVOID                         Reserved3;
PPEB_LDR_DATA               Ldr;    //指向PEB_LDR_DATA结构
PRTL_USER_PROCESS_PARAMETERSProcessParameters;
BYTE                        Reserved4;
PVOID                         Reserved5;
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE                        Reserved6;
PVOID                         Reserved7;
ULONG                         SessionId;
} PEB, *PPEB;
PEB_LDR_DATA:
typedef struct _PEB_LDR_DATA {BYTE       Reserved1;
PVOID      Reserved2;
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;
    LIST_ENTRY InMemoryOrderLinks;
    PVOID Reserved2;
    PVOID DllBase;//加载的DLL的基址
    PVOID EntryPoint;
    PVOID Reserved3;
    UNICODE_STRING FullDllName;
    BYTE Reserved4;
    PVOID Reserved5;
    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,      ;Nt_Header
MOV EBX,
MOV EBX,   ;输出表地址 偏移
POP EAX
LEA EBX,      ;ebx=输出表地址
MOV ECX,      ;NumberOfNames
MOV EDX,      ;AddressOfNames
ADD EDX,EAX
MOV EDI,      ;Base
Start:
MOV ESI,      ;枚举函数名地址
ADD ESI,EAX
CMP DWORD PTR ,50746547 ;GetP
JNZ Next
CMP DWORD PTR ,41636F72 ;rocA
JNZ Next
CMP DWORD PTR ,65726464 ;ddre
JNZ Next
CMP WORD PTR ,7373       ;ss
JNZ Next
JMPFinish
Next:
INC EDI
CMP EDI,ECX
JNZStart
Finish:
MOV EDX,                ;AddressOfNameOrdinals
ADD EDX,EAX
MOV DI,            ;读序号表值
MOV EDX,                ;AddressOfFunctions
ADD EDX,EAX
MOV ESI,             ;函数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 ,4D746547;填充数据
MOV DWORD PTR ,6C75646F
MOV DWORD PTR ,6E614865
MOV DWORD PTR ,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 ,72657375
MOV DWORD PTR ,642E3233
MOV DWORD PTR ,6C6C;user32.dll
PUSH ESP
CALL
ADD ESP,10                     ;记得要维护平衡
PUSH 0
PUSH 0
PUSH 0
PUSH 0
MOV DWORD PTR ,7373654D
MOV DWORD PTR ,42656761
MOV DWORD PTR ,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 ,6361724D   
MOV DWORD PTR ,6853206B
MOV DWORD PTR ,636C6C65
MOV DWORD PTR ,65646F         ;Mrack Shellcode
PUSH 0
LEA EDX,                        ;由于Push 0 了改变了ESP的值.故ESP+4
PUSH EDX
PUSH EDX
PUSH 0
CALL EAX                              ;调用MessageBoxA
ADD ESP,14


易语言/ASM 源码与PDF版:
**** Hidden Message *****


JuStkK 发表于 2015-7-25 20:12

沙发,顺便说一下 什么都看不懂!!!{:6_224:}

虚竹 发表于 2015-7-25 20:28

师傅还是这么牛逼!

童真丶 发表于 2015-7-25 20:29

{:5_117:}   这么好的技术不吾爱汇编论坛浪费了.!

kingone 发表于 2015-7-25 20:29

{:5_116:}膜拜 学习了

哎呦呦 发表于 2015-7-25 20:36

ASM 写的有点看不明白

情人节免费 发表于 2015-7-25 21:05

传说中的好东西.

LYQingYe 发表于 2015-7-25 21:36

沙发,顺便说一下 什么都看不懂!!!{:6_224:}

钢棍泄师傅 发表于 2015-7-25 22:15

{:5_118:}干什么用我不知道捏

阿卡林 发表于 2015-7-27 20:13

{:5_118:}膜拜M牛
页: [1] 2 3
查看完整版本: ShellCode技术研究