Articles of 内存地址

ASLR和地址

看看这个主要的: int main() { int asd = 10; printf("%p\n", &asd); return 0; } asd在给定时刻的地址: 0x7ffff5f7c16c 主要地址(总是一样的): (gdb) disass main Dump of assembler code for function main: 0x00000000004005b4 <+0>: push %rbp 为什么一个正则c程序的variables的地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我发现地址变化是由ASLR模式引起的,但是为什么它只影响程序variables,并不影响代码的分配位置? 这是否与作为代码部分ro的事实有关,如果不是绝对必要的,它是没有意义的随机化的? 此外,为什么主要的地址与variablesasd的地址之间有巨大的差距?

内核sys_call_table地址与system.map中指定的地址不匹配

我想刷C,所以我一直在玩Linux内核的系统调用表(在3.13.0-32-generics)。 我发现了一个在线资源,用以下函数search系统调用表,我在LKM中加载到内核中: static uint64_t **aquire_sys_call_table(void) { uint64_t offset = PAGE_OFFSET; uint64_t **sct; while (offset < ULLONG_MAX) { sct = (uint64_t **)offset; if (sct[__NR_close] == (uint64_t *) sys_close) { printk("\nsys_call_table found at address: 0x%p\n", sys_call_table); return sct; } offset += sizeof(void *); } return NULL; } 该function起作用。 我能够使用它返回的地址来操纵系统调用表。 我不明白为什么这个函数返回的地址与/boot/System.map-(KERNEL)中的地址不匹配 这是什么function打印: sys_call_table found at address: 0xffff880001801400 这是我searchsystem.map时得到的 […]

主函数总是在同一地址加载,而variables在大多数情况下有不同的地址?

我今天写了这个小程序,结果被我吹走了。 这是程序 int main(int argc, char **argv) { int a; printf("\n\tMain is located at: %p and the variable a is located at address: %p",main,&a); return 0; } 在我的机器上,主函数总是被加载到地址“0x80483d4”,并且variables的地址不断变化。这是怎么发生的? 我在操作系统中读到,作为虚拟化scheme的一部分,操作系统一直在重定位指令的地址。 那么为什么每次我运行这个程序时,主要被加载在同一个地址? 在此先感谢家伙。

文件名已被加载的地址缺失

我有以下示例代码 #include<stdio.h> int main() { int num1, num2; printf("Enter two numbers\n"); scanf("%d",&num1); scanf("%d",&num2); int i; for(i = 0; i < num2; i++) num1 = num1 + num1; printf("Result is %d \n",num1); return 0; } 我用-g选项编译了这个代码给gcc。 gcc -g file.c 生成单独的符号文件 objcopy –only-keep-debug a.out a.out.sym 从a.out中删除符号 strip -s a.out 在gdb中加载这个a.out gdb a.out gdb说“没有finddebugging信息”很好。 然后我在gdb中使用add-symbol-file命令 (gdb) add-symbol-file a.out.debug […]

禁用内存地址的随机化

我试图debugging一个使用了很多指针的二进制文件。 有时,为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是对象地址是随机的,这就违反了快速检查的目的。 有没有一种方法来暂时/永久禁用此function,以便每次运行该程序时都能得到相同的值。 哎呀。 OS是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

如何在Linux中解码/ proc / pid / pagemap条目?

我正在试图破译如何使用/ proc / pid / pagemap来获取给定页面的物理地址。 假设从/ proc / pid / maps中,我得到对应于堆的虚拟地址afa2d000-afa42000。 我的问题是如何使用这个信息来遍历页面地图文件,并find物理页面框架对应的地址afa2d000-afa42000。 / proc / pid / pagemap条目是二进制格式。 有没有什么工具来帮助parsing这个文件?

为什么Windows为其系统地址空间预留1Gb(或2 Gb)?

众所周知,Windows应用程序通常在32位系统上拥有2Gb的专用地址空间。 这个空间可以通过/ 3Gb开关扩展到3Gb。 操作系统保留其余的4Gb。 我的问题是为什么? 以内核模式(即设备驱动程序代码)运行的代码有自己的地址空间。 为什么在独占的4Gb地址空间之上,操作系统仍然要保留2Gb的每个用户模式进程? 我认为原因是用户模式和内核模式调用之间的转换。 例如,对NtWriteFile的调用将需要一个内核调度例程的地址(因此为什么系统在每个应用程序中预留2Gb)。 但是,使用SYSENTER ,是不是足够的内核模式代码知道哪个函数/服务被调用的系统服务号? 如果您可以向我澄清,为什么操作系统在每个用户模式进程中占用2Gb(或1Gb)是如此重要。

从用户空间访问物理地址

在运行Linux的基于ARM的系统上,我有一个内存映射到物理地址的设备。 从所有地址都是虚拟的用户空间程序,我如何从这个地址读取内容?