今天在看x32注入的x64的时候意识到一个问题,既然x32能到x64那x64也能到x32,于是写下了下面的代码。
#include<windows.h>
#include<stdio.h>
//这里是返回到x32模式
char RetFar[10] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x00 };
__declspec(naked) void exp() {
__asm {
__emit 0xcc
}
}
__declspec(naked) void run() {
__asm {
mov rax, 0x0000000140007000
__emit 0x48 //jmp far tword ptr ds:[rax]
__emit 0xff
__emit 0x28
}
}
int main() {
DWORD Address = 0x401000,targetAddress=0;
targetAddress=(DWORD)VirtualAllocEx(GetCurrentProcess(),&Address,0x1000,MEM_COMMIT, PAGE_EXECUTE_READWRITE);
printf("%d\n",GetLastError());//ERROR_ACCESS_DENIED
*(PULONG64)RetFar = targetAddress;//(ULONG64)exp;
memset(&targetAddress,0xcc,0x1000);
run();
return 0;
}
这个代码的作用是切换cs段选择子到x32模式下,但是如果直接却换的话地址是大于7fffffff的,所以直接访问的话会出现c0000005错误,所以这里尝试申请这块地址,但是最后的返回值为5。意思就是系统不让我们申请这块地址,最后导致就算切换到了x32也不能执行x32的代码。
目前无法解决这个问题,发出来希望看到的大佬指点一下。