我编写了一些代码来从地址读取数据。该地址属于代码段(我反汇编了我的二进制文件并查找 main 所在的位置,因此地址来自那里)。主要目标是改变内容。当我打印它时,它会导致段错误。这是某种保护吗?
void at(){
char *p = 0x0000000100000f47;
printf("%c", p[0]);
}
int main(){
at();
return 0;
}
最佳答案
Is it some kind of protection ?
是的。分割!这就是出现段错误的原因。
I disassemble my binary and lookup where main is located, so address is from there
这并没有说明太多;当加载可执行文件时,它的一部分会重新定位,因此它们最终会位于不同的位置。
这是一个相当复杂的过程(并且容易出错),并且涉及 libc/rtloader/您的操作系统/黑魔法;这里甚至可能发生内存布局随机化(但对于您的代码来说可能不是),因此运行时有意确保您无法“猜测”某些事物的内存位置。
关于c - 打印内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808310/