碰到编译优化的问题

今天想通过free伪造fast bin trunk,代码如下:

int main()

{

        char *p = (char *) malloc(10);

        long arr[20];

        arr[0] = 0;

        arr[1] = 0x20;

        arr[2] = 0;

        arr[5] = 200;

//      printf("%p\n", p);

        free(p);

        free(&arr[2]);

        printf("%lu %p\n", arr[1],arr[2]);

        return 0;

}

发现不注释printf("%p\n", p);能得到正确的结果,注释掉后运行报错。

*** Error in `./fastbinfree': corrupted size vs. prev_size: 0x00007fffb448ae80


怀疑编译优化导致的,于是在编译选项增加了 -O0 强行关闭优化,但运行依旧报错!

上IDA,反编译 -O0 得到的bin:

v7 = __readfsqword(0x28u);

  ptr = malloc(0xAuLL);

  v5 = 0LL;

  v6 = 200LL;

  free(ptr);

  free(&v5);

  printf("%lu %p\n", 32LL, v5);

发现栈数据 arr[1] = 0x20 的赋值被忽略,导致fast bin构造失败。


看来 -O0 也挡不住gcc的优化啊

你可能感兴趣的:(碰到编译优化的问题)