c - 打印内存时出现段错误

标签 c memory disassembly

我编写了一些代码来从地址读取数据。该地址属于代码段(我反汇编了我的二进制文件并查找 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/

相关文章:

c - 我的功能是以不同的方式将 PGM 图像文件复制到 PPM

c - 相同的 C 代码表现不同

c++ - Windows中是否有任何内存虚拟文件API?

c - R: 如何让.C 调用更新输出变量?

python - 什么时候用 C 重写 Python 模块有意义?

image - Juicy Pixels 提示内存不足

c - 安全的 C 编程

assembly - 反汇编PDP-8程序

c# - 如果System.Double将常量字段 "NaN"初始化为double.NaN,是不是意味着 "Double"和 "double"指的不是同一个类型?

c - 粉碎栈example3.c困惑