微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在内存布局中意外编辑文本段?

如何解决如何在内存布局中意外编辑文本段?

所以在消化内存布局的时候,我偶然发现了一个非常有趣的说法:在最终的可执行目标文件的文本部分,我们只有读取和执行权限,没有写入权限。这样做是为了防止对相应汇编代码的意外修改,好的,因为文本段位于远离堆和堆栈的位置,并且没有堆/堆栈溢出会影响我们的中央指令,什么可能“意外”修改我们的文本段?一些代码示例将不胜感激?

解决方法

Text Segment 如何在内存布局中被意外编辑?

最常见的错误当然是写入字符串文字。字符串文字是不可变的,只读的。遗憾的是,在 C 语言中,字符串文字不是 const 指针,可以分配给 char* 指针。使用 gcc 确保使用 -Wwrite-strings 警告。一个常见的初学者错误是认为数组会自动调整大小:

char *str = "Hello";
strcat(str," world!"); // WRONG!

以 ex 为例。行程:

char *str = "this is a string";
strtok(str," "); // WRONG!

非常感谢一些代码示例?

可能有许多代码示例尝试写入文本段。您可以写入内存位置未初始化的指针,但您不知道写入的位置:

void foo() {
   int *a;
   *a = 42;
}

我个人喜欢 rand() 的不可预测性:

int *a = (int*)rand();
*a = 42;

此类代码可以写入任何可能的位置。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。