今天想通过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的优化啊
网友评论