看看这个主要的:
int main() { int asd = 10; printf("%pn",&asd); return 0; }
asd在给定时刻的地址:
0x7ffff5f7c16c
主要地址(总是一样的):
(gdb) disass main Dump of assembler code for function main: 0x00000000004005b4 <+0>: push %rbp
为什么一个正则c程序的variables的地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我发现地址变化是由ASLR模式引起的,但是为什么它只影响程序variables,并不影响代码的分配位置? 这是否与作为代码部分ro的事实有关,如果不是绝对必要的,它是没有意义的随机化的?
OllyDbg中的地址更改程序重新加载
文件名已被加载的地址缺失
在Linux中查找共享库的加载地址
访问连续的物理地址比虚拟地址快吗?
内核sys_call_table地址与system.map中指定的地址不匹配
此外,为什么主要的地址与variablesasd的地址之间有巨大的差距?
禁用内存地址的随机化
如何在C ++中返回存储在特定内存地址的variables的名称
如何在Linux中解码/ proc / pid / pagemap条目?
如何打印进程在C中使用的内存的每个字节?
ASLR主要发生在mmap(2)时间。 主线程的堆栈段在execve(2)时间(你的程序)被分配 – 但可能是“随机”定位的。 你的main的初始堆栈指针也取决于各种因素(特别是你的环境 – 见environ(7) )。
堆栈指针在execve时间被设置。 它被传递给crt0.o启动目标文件(它调用你的main ),例如在x86-64 ABI规范中定义的约定。
main的地址在ELF可执行文件中是固定的。 除非你的代码是位置独立的代码 (即编译-fPIE或-fPIC等),它不能被移动(因为这将需要特定的重定位 )。 在你的badnack可执行文件中使用objdump -f badnack来查找。 也pmap在你的过程。 和PIC有一个小的成本(它使用更多的寄存器)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。