内存数据执行

#内存数据执行

数据执行保护 (DEP)

DEP 可以防止应用运行用于暂存指令的那部分内存中的数据,从而保护电脑。

关闭DEP:
DEP关闭

关闭GS:
关闭GS

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<stdlib.h>
int main(){
long long nMagic = 0xc30fc0830424448b; //奇怪的数据
int(*p)(int) = nullptr;
int n = 0;

p = (int(*)(int))&nMagic;
printf("%d", n = p(n));

system("pause");
return 0;
}

运行结果:
数据执行

在反汇编窗口中可以看到
这是magic的机器码
汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	p = (int(*)(int))&nMagic;
00631834 8D 45 F4 lea eax,[nMagic]
00631837 89 45 E8 mov dword ptr [p],eax
printf("%d", n = p(n));
0063183A 8B F4 mov esi,esp
0063183C 8B 45 DC mov eax,dword ptr [n]
0063183F 50 push eax
00631840 FF 55 E8 call dword ptr [p]//这个call将longlong当成了函数调用
00631843 83 C4 04 add esp,4
00631846 3B F4 cmp esi,esp
00631848 E8 CF F9 FF FF call __RTC_CheckEsp (063121Ch)
0063184D 89 45 DC mov dword ptr [n],eax
00631850 8B 4D DC mov ecx,dword ptr [n]
00631853 51 push ecx
00631854 68 30 7B 63 00 push offset string "%d" (0637B30h)
00631859 E8 ED F7 FF FF call _printf (063104Bh)
0063185E 83 C4 08 add esp,8

0xc30fc0830424448b是汇编指令:

1
2
3
mov eax,dword ptr [esp+4]
add eax,0Fh
ret

的机器码,函数指针指向了变量并且成功执行(第一个参数是在call之前的push进去的,值为n的值)