1.reserve3
先放到EXE中查看
发现无壳,放入IDA32中
F5反汇编
双击进入main函数
查看sub_4110BE进行的操作,双击进入
进入
发现为base64加密,返回main函数查看需要解密的字符串为Str2,进入
写脚本进行解密,先把字符串中的字符转化为ASCII码
import base64
s="e3nifIH9b_C@n@dH"
x=""
for i in range(0,len(s):
x+=chr(ord(s[i])-i) //把字符转化为相应ASCII码
printf(base64.d64decode(x)) //base64解密
运行后就可以得到flag
2.不一样的flag
先放入EXE中查看
无壳,32位,放入IDA中,F5反汇编
选中49和35按R将ASCII码换成字符
仔细观察,发现为用v3构成的5*5迷宫,碰到1时退出,碰到#时成功,进入的顺序即为flag
根据数字代表的动作,即可得到flag为222441144222
3.PE拉伸函数
void FileBuffer_To_ImageBuffer(void* pFileBuffer,void** pImagebuffer)
{
PIMAGE_DOS_HEADER pDosHeader=NULL;
PIMAGE_NT_HEADERS pNTHeader=NULL;
PIMAGE_FILE_HEADER pPEHeader=NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader=NULL;
PIMAGE_SECTION_HEADER pSectionHeader=NULL;
//初始化
pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader=(PIMAGE_NT_HEADERS)((DWORD*)pFileBuffer+pDosHeader->e_lfanew);
pPEHeader=(PIMAGE_FILE_HEADER)((BYTE*)pNTHeader+sizeof(DWORD));
pOptionHeader=(PIMAGE_OPTIONAL_HEADER32)((BYTE*)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader=(PIMAGE_SECTION_HEADER)((BYTE*)pOptionHeader+pPEHeader->SizeOfOptionalHeader);
void* pTempFileBuffer=NULL;
//判断是否有有效MZ和PE标志
if(*(PWORD)pFileBuffer!=IMAGE_DOS_SIGNATURE){
printf("无有效的MA标识\n");
}
if(*(PWORD)((DWORD)pFileBuffer+pDosHeader->e_lfanew)!=IMAGE_NT_SIGNATURE){
printf("无有效的PE标识\n");
}
//开辟空间
pTempFileBuffer=malloc(pOptionHeader->SizeOfImage);
if(!pTempFileBuffer){
printf("pTemFileBuffer空间申请失败...");
}
//移动头和节表
memset(pTemFileBuffer,0,pOptionHeader->SizeOfImage);
memcpy(pTemFileBuffer,pFileBuffer,pOptionHeader->SizeOfHeaders);
//移动节
for(i=pPEHeader->NumberOfSections;i>0;i--){
memcpy((LPVOID)((DWORD)pTemFileBuffer+pSectionHeader->VirtualAddress),(LPVOID)((DWORD)pDosHeader+pSectionHeader->PointToRawDat),pSectionHeader->SizeOfRawDate)
}
*pImageBuffer=pTempFileBuffer;
pTempFileBuffer=NULL;
}