我写了一些代码来从地址读取数据。这个地址属于代码段(我反汇编我的二进制文件并查找main所在的位置,因此地址来自那里)。主要目标是改变内容。当我打印它时,它会导致段错误。这是某种保护吗?
void at(){
char *p = 0x0000000100000f47;
printf("%c", p[0]);
}
int main(){
at();
return 0;
}
答案 0 :(得分:2)
是否有某种保护?
是。分割!这就是你遇到分段错误的原因。
我反汇编我的二进制文件并查找main所在的位置,因此地址来自那里
并没有多说;当一个可执行文件被加载时,它的一部分被重新定位,所以它们最终会在不同的位置。
这是一个相当复杂的过程(并且容易出错),它涉及libc / rtloader /你的操作系统/黑魔法;甚至可能在这里进行内存布局随机化(可能不是,对于你的代码),因此运行时有意识地确保你不能猜测"某些东西的记忆位置。