我的目标是编写一个类似金丝雀的机制来检测字符缓冲区中的溢出。我想要做的是获取缓冲区末尾的地址,并在那里放置一个金丝雀,这样写过去的缓冲区就会导致金丝雀值的改变。经过一些调试后,我发现一个问题是,当我向地址写入值时,地址本身的值会意外地发生变化。有人能解释一下为什么会发生这种事吗?
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand(time(NULL));
int secret = rand();
char buf[8];
char *aft_buf = buf + 8;
printf("aft buf address = %p\n", aft_buf);
int *canary = (int *) aft_buf;
*canary = secret;
printf("canary address = %p\n", canary); // this value becomes different from aft_buf. why?
return 0;
}我正在用gcc -fno-stack-protector编译,当我用-O2标志编译时,我不会遇到这个问题。
发布于 2022-11-02 06:56:22
你需要为金丝雀留出空间:
char buf[8+sizeof(int)];https://stackoverflow.com/questions/74285294
复制相似问题