gpt4 book ai didi

c - Visual C 2010 中内联汇编的访问冲突

转载 作者:行者123 更新时间:2023-11-30 14:22:21 24 4
gpt4 key购买 nike

我有一个简单的 C 程序,带有编译器开关:/GS-

这只是将 EIP 更改为机器代码字符串位置的概念证明。

假设我们设置 EIP = 0x012f5000,这会将 EIP 置于以下数组的地址:

字符代码[] = "\x00\x00\x8B\x00\x00";

我不知道这些指令到底会做什么,但 x00 指令似乎是空的。将 EIP 切换到程序中的任何其他位置似乎会导致问题,但是当我将 EIP 指向该数组的地址时,我在 EIP 的该位置收到一些“访问冲突”异常。

为什么我会收到此错误?这是因为某种 Windows 保护机制吗?或者Windows无法运行这种字符串形式的指令?如何让程序执行这些指令?

最佳答案

我猜你使用的是 x86 32 位机器代码,如果不是我的答案是不正确的。

您的机器代码给出以下内容

0000          ADD BYTE PTR DS:[EAX],AL
8B00 MOV EAX,DWORD PTR DS:[EAX]
00XX ADD BYTE PTR ??? ; depends on the next byte

正如您所看到的,如果您尝试执行此命令,它会尝试访问 eax 中的地址处的内存。它也不以 ret 或其他内容结尾,因此它将直接运行,而不关心接下来的内容。大多数情况下这会崩溃。无论如何,您也有可能无法执行 DATA 段中定义的代码。

如果你想执行一些 shellcode,你可以尝试像下面的简单模板一样。这个想法是在堆栈上创建代码并在那里执行它。给定的机器代码函数没有很好地实现,但至少是正确的并且不会导致崩溃。它相当于C代码

void f( void ) { return; };

由VC++在 Debug模式下编译。

#include <stdio.h> 

int main()
{
const char code[] = "\x55\x8B\xEC\x81\xEC\xC0\x00\x00"
"\x00\x53\x56\x57\x8D\xBD\x40\xFF"
"\xFF\xFF\xB9\x30\x00\x00\x00\xB8"
"\xCC\xCC\xCC\xCC\xF3\xAB\x5F\x5E"
"\x5B\x8B\xE5\x5D\xC3";

printf("Start execution\r\n");
((void (*)())code)();
printf("End execution\r\n");
_getch();
}

如果以上方法不起作用,您可以尝试。

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>

int main()
{
const char code[] = "\x55\x8B\xEC\x81\xEC\xC0\x00\x00"
"\x00\x53\x56\x57\x8D\xBD\x40\xFF"
"\xFF\xFF\xB9\x30\x00\x00\x00\xB8"
"\xCC\xCC\xCC\xCC\xF3\xAB\x5F\x5E"
"\x5B\x8B\xE5\x5D\xC3";

void *exec = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, code, sizeof(code));

printf("Start execution\r\n");
((void(*)())exec)();
printf("End execution\r\n");
//_getch();
}

这个想法是使用带有标志PAGE_EXECUTE_READWRITE的已分配内存页。

关于c - Visual C 2010 中内联汇编的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com