1.Illusion

这标着是简单题,我倒要看看是怎么样的

用detect it easy看了一下并没有加壳

1

开头就有个字符串验证LABEL_12有exit(0)一看就是有异常退出

所以

1
2
3
4
5
6
7
8
9
10
11
12
if ( n28024[0] != 'x' )
goto LABEL_12;{}
if ( *(_WORD *)&n28024[1] != 'cm' )
goto LABEL_12;
if ( n116 != 't' )
goto LABEL_12;
if ( n102 != 'f' )
goto LABEL_12;
if ( n123 != '{' )
goto LABEL_12;
if ( Source[18] != '}' )
goto LABEL_12;

可以看出来最后一个下标18为}所以猜测字符串长为19

这道题应该有反调试首先是

输入之后直接来这个沉浸在幻术之中吧,那么main函数真的是程序的主逻辑所在吗

题目名称是illusion幻觉

1
2
3
4
5
6
7
8
9
int func(void)
{
return 3;
}
int gi = func();
int main()
{
return gi;
}

c不允许这代码,它不允许常数表达式的函数调用

c规定静态存储期变量必须用常数表达式初始化,函数调用不是常量表达式

执行main/Wmain函数前,c/c++运行时库会进行一系列初始化,

2

在初始化时回到用_initterm与_initterm_,按表顺序遍历并调用,批量调用前置的初始化函数

1
_initterm(&_initterm_ptr, &_initterm_ptr_end)

发现调用sub_7FF7ABB81000//这简单题就有inlinehook,发现以前学的还是太浅了

VirtualProtect(MessageBoxA, 0xEu, 0x40u, &flOldProtect)

为什么是0xe这个14字节,因为jmp函数在汇编中jmp指令是ff 25 00 00 00 00 +8字节

指令由操作码(opcode)与操作数组成(oprand)

CRT初始化

程序的默认入口点是CRT提供的函数:

控制台程序:mainCRTStartup

程序窗口:WinMainCRTStartup

主要完成

1.操作系统底层对接与安全环境准备(安全环境cookie初始化)

2.操作系统参数的翻译

3.CRT本身核心组件的初始化(Heap init, I/O系统与标准流,区域设置)

4.执行C++全局/静态对象的构造

5.执行main函数

Windows的API

GetModuleHandle:获取模块句柄,获取加载DLL的及地址

GetProcAdress:获取函数地址,从指定DLL中导出函数地址

VirtualProtect:修改内存保护属性,改变一快内存的权限

1
2
3
4
5
6
7
8
Bool VirtualProtect(

[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpfloldProtect

);

[in] LPVOID lpAddres是访问保护属性的页区域的起始页的地址

[in]SIZE_T dwSize:区域的大小

[in] flNewProtect内存保护选项

[out] lpfloldProtect指向变量的指针,接受第一页先前的访问保存值(备份原来的值)