上篇《[shellcode框架(一)] 认识shellcode,部署shellcode开放框架》我已经介绍了如何去部署shellcode框架。
这篇文章带领大家完善shellcode的框架。
一. 部署gethash.c工程
1. 新建工程,选择win32->win32 console application工程;名字gethash
2. apploction settings设置面板处,选择empty project
3. 将gethash.c放入工程目录下,并加入gethash工程
4. 选中gethash.c属性,设置 c/c++ -> Precompilde Headers -> Precompilded Header为 Not Using Precompiled Headers
5. 编译
二. 部署str2intarr.c工程
1. 新建工程,选择win32->win32 console application工程;名字str2intarr.c
2. apploction settings设置面板处,选择empty project
3. 将str2intarr.c放入工程目录下,并加入str2intarr工程
4. 选中str2intarr.c属性,设置 c/c++ -> Precompilde Headers -> Precompilded Header为 Not Using Precompiled Headers
5. 编译
三. 修改shellcode.c工程使之可以dump二进制shellcode文件
void DumpShellcode2File(char* szFileName,BYTE* start,int size)
{
FILE* file ;
file = fopen(szFileName,"wb+");
fwrite(start,1,size,file);
fclose(file);
}
void main(void)
{
DWORD ShellCodeSize;
ShellCodeSize = (DWORD)EndSign - (DWORD)ShellCode;
ShellCodeToHex ( (BYTE *)ShellCode, ShellCodeSize, stdout );
DumpShellcode2File("c:\\temp\\c.sc",(BYTE*)ShellCode,ShellCodeSize);
getchar();
ShellCode();
}
四. 测试shellcode工具
为了便于测试验证dump生成的shellcode是否正确,开发了这个小工具,代码如下
void main()
{
FILE* file = 0;
int iRead = 0;
HANDLE hFile =CreateFile(argc==2 ? argv[1]:"c:\\temp\\c.sc",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (argc==2)
{
printf("%s \r\n",argv[1]);
}
fprintf(stdout,"test shellcode ........... \n");
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSizeHigh = 0;
DWORD dwFileSizeLow = GetFileSize(hFile,&dwFileSizeHigh);
fprintf(stdout,"file size is 0x%x \n",dwFileSizeLow);
BYTE* lpMem = (BYTE*)VirtualAlloc(NULL,dwFileSizeLow+4,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
ZeroMemory(lpMem,dwFileSizeLow+4);
fprintf(stdout,"Memeroy is 0x%X \n",lpMem);
if (argc == 2)
{
getchar();
}
ReadFile(hFile,lpMem,dwFileSizeLow,&dwFileSizeHigh,NULL);
printf("should read %d ,readed %d byte \n",dwFileSizeLow,dwFileSizeHigh);
CloseHandle(hFile);
//getchar();
_asm{
call lpMem
}
}else
{
fprintf(stdout,"open file error [0x%x] \n",GetLastError());
}
}
就是将dump的二进制sheLLcode文件读入可读可写可执行的内存中去,并call这块内存,来执行shellcode。
我这里将两个工具工程做了合并,做了个gui程序便于使用。目前还有很多不足,有意见大家提出,我就改动。这里不开放代码的问题是我用了BCG的mfcUI库,BCG库还学安装怕大家麻烦。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)