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