常规操作shift+f12 x交叉应用 按f5查看伪代码
e3nifIH9b_C@n@dH分析代码可知
e3nifIH9b_C@n@dH为str2
`ord` 函数的作用是将字符转换成其相应的 ASCII 码值
通过此网站解密base64加密
{i_l0ve_you}
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v3; // [esp+17h] [ebp-35h]
int v4; // [esp+30h] [ebp-1Ch]
int v5; // [esp+34h] [ebp-18h]
signed int v6; // [esp+38h] [ebp-14h]
int i; // [esp+3Ch] [ebp-10h]
int v8; // [esp+40h] [ebp-Ch]
__main();
v4 = 0;
v5 = 0;
qmemcpy(&v3, _data_start__, 0x19u);
while ( 1 )
{
puts("you can choose one action to execute");
puts("1 up");
puts("2 down");
puts("3 left");
printf("4 right\n:");
scanf("%d", &v6);
if ( v6 == 2 )
{
++v4;
}
else if ( v6 > 2 )
{
if ( v6 == 3 )
{
--v5;
}
else
{
if ( v6 != 4 )
LABEL_13:
exit(1);
++v5;
}
}
else
{
if ( v6 != 1 )
goto LABEL_13;
--v4;
}
for ( i = 0; i <= 1; ++i )
{
if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
exit(1);
}
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == '1' )
exit(1);
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == '#' )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
}
}
观察字符串可知
*1111
01000
01010
00010
1111#
个数为25,猜测图形为正方形将其拆分为五个一组
走0不走1
下下下右右上上右右下下下下
对应exe程序222441144222
#define _CRT_SECURE_NO_WARNINGS
//#define FileName "example.exe"
#include <iostream>
using namespace std;
int FileSize;
const char* FileName="example.exe";
void* ReadPeFile(const char* FileName)
{
void* pFileBuffer;
FILE* pFile = NULL;
pFile = fopen(FileName, "rb");
if (pFile == NULL)
{
cout << "pe文件打开失败" ;
return 0;
}
fseek(pFile, 0, SEEK_END);
FileSize = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
pFileBuffer = malloc(FileSize);
if (!pFileBuffer)
{
cout << "申请空间失败";
fclose(pFile);
return 0;
}
int n = fread(pFileBuffer, FileSize, 1, pFile);
if (!n)
{
cout << "读取数据失败";
free(pFileBuffer);
fclose(pFile);
return 0;
}
fclose(pFile);
return pFileBuffer;
}
int main()
{
ReadPeFile(FileName);
cout << "程序执行完成" << endl;
}
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // 魔术数字5A4D
WORD e_cblp; // 文件最后页的字节数0090
WORD e_cp; // 文件页数0003
WORD e_crlc; // 重定义元素个数0000
WORD e_cparhdr; // 头部尺寸,以段落为单位0004
WORD e_minalloc; // 所需的最小附加段0000
WORD e_maxalloc; // 所需的最大附加段FFFF
WORD e_ss; // 初始的SS值(相对偏移量)0000
WORD e_sp; // 初始的SP值00B8
WORD e_csum; // 校验和0000
WORD e_ip; // 初始的IP值0000
WORD e_cs; // 初始的CS值(相对偏移量)0000
WORD e_lfarlc; // 重分配表文件地址0000
WORD e_ovno; // 覆盖号0040
WORD e_res[4]; // 保留字0000 0000 0000 0000
WORD e_oemid; // OEM标识符(相对e_oeminfo)0000
WORD e_oeminfo; // OEM信息0000
WORD e_res2[10]; // 保留字0000 0000 0000 0000 0000
LONG e_lfanew; // 新exe头部的文件地址0000 0080
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
dos存根
pe头
2、标准PE头:
WORD Machine; * 程序运行的CPU型号:0x0 任何处理器/0x14C 386及后续处理器 8646
WORD NumberOfSections; * 文件中存在的节的总数,如果要新增节或者合并节 就要修改这个值. 0010
DWORD TimeDateStamp; * 时间戳:文件的创建时间(和操作系统的创建时间无关),编译器填写的. 65B45EA6
DWORD PointerToSymbolTable; 0000DE00
DWORD NumberOfSymbols; 0000049F
WORD SizeOfOptionalHeader; * 可选PE头的大小,32位PE文件默认E0h 64位PE文件默认为F0h 大小可以自定义. 00F0
WORD Characteristics; * 每个位有不同的含义,可执行文件值为10F 即0 1 2 3 8位置1 0027