buuctf reserve 8.9.;PE拉伸函数

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

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值