【问题标题】:Why am I receiving an "Access Violation" Error on this memcpy function?为什么我在这个 memcpy 函数上收到“访问冲突”错误?
【发布时间】:2021-11-06 11:46:04
【问题描述】:

在 Visual Studio 中运行此程序时,当程序到达 memcpy 函数时,我收到“访问冲突”错误。无论我制作这个缓冲区的大小,它总是会抛出这个读取访问冲突错误。我在 memcpy 函数上设置了断点,一旦我继续执行,它就会抛出这个错误:

snip of error

char data[DATA_SIZE] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
#define DATA_SIZE 27136

void spawn(void * buffer, int length, char * key);

typedef struct {
    int  offset;
    int  length;
    char key[4];
    int  gmh_offset;
    int  gpa_offset;
    char payload[DATA_SIZE];
} phear;

extern char data[DATA_SIZE];
void start(HINSTANCE mhandle) {
    
    phear * payload = (phear *)data;
    char * buffer;

    buffer = (char *)malloc(payload->length);
    memcpy(buffer, payload->payload, payload->length);

    /* execute our code */
    spawn(buffer, payload->length, payload->key);

    /* clean up after ourselves */
    free(buffer);
}

【问题讨论】:

  • 出错时访问的是哪个指针?源头还是目的地? payload->length 的值是多少?例如,它是否大于DATA_SIZE? data 是否以某种方式无效?也就是说,需要更多的调试数据。
  • (phear *)data; 为什么会有phear data?至少,data 与phear 没有对齐。
  • data 不是phear,也不能这样对待。除了对齐问题,它明显小于实际的phear。停止使用类型转换。他们不需要这样做,并且他们允许错误。如果您需要phear,则声明 phear,而不是char 数组。
  • 扩展 Tom 的评论,执行:phear data; 和 extern phear data; 并消除演员表

标签: c memory malloc memcpy shellcode


【解决方案1】:

这里有几个问题:

  • data 可能未正确对齐 phear。见What is aligned memory allocation?
  • payload->length 是一个严格的别名违规:这被定义为 (*payload).length 并且表达式 *payload 通过 phear 类型的表达式访问内存,但在该位置没有 phear 类型的对象。
  • (如果我们暂时忽略上述两个问题)memcpy 的读取超出范围是因为sizeof data < sizeof(phear)。

一个简单的解决方案是使用extern phear data; 而不是char 数组。如果您真的想使用 char 数组,请使用 memcpy 而不是 struct 访问将数据复制进出它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2015-05-31
    相关资源
    最近更新 更多