如果我在一个函数中定义一个本地字符数组,然后使用objdump来获取该特定函数的汇编代码,我可以在汇编代码中找到该数组的内存吗?你可以在使用objdump的函数中找到本地字符数组的内存吗?
这是我有一个家庭作业的问题。
如果我在一个函数中定义一个本地字符数组,然后使用objdump来获取该特定函数的汇编代码,我可以在汇编代码中找到该数组的内存吗?你可以在使用objdump的函数中找到本地字符数组的内存吗?
这是我有一个家庭作业的问题。
当然,只要你的数组有一个非零的初始值设定项,你应该能够找到它。下面是我对ARM做出了表率:
char function(int i)
{
char arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
return arr[i];
}
构建:
$ clang -O2 -Wall -c -o example.o example.c
拆卸输出:
$ objdump -d example.o
example.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <function>:
0: e59f1004 ldr r1, [pc, #4] ; c <function+0xc>
4: e7d10000 ldrb r0, [r1, r0]
8: e12fff1e bx lr
c: 00000000 .word 0x00000000
嗯 - 注意.word 0x0000000
在偏移0xc
?这将被链接器指向数组。让我们来看看重新安置表:
$ objdump -r example.o
example.o: file format elf32-littlearm
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000008 R_ARM_V4BX *ABS*
0000000c R_ARM_ABS32 .rodata.cst8
啊哈! 0xc
这个词将会被绝对指向.rodata.cst8
部分 - 这听起来像我们想要的。让我们来看看:
$ objdump -s -j .rodata.cst8 example.o
example.o: file format elf32-littlearm
Contents of section .rodata.cst8:
0000 01020304 05060708 ........
而且你有数组的内容!
本地数组仅在运行时(在输入函数时)在堆栈上分配。所以它不在可执行文件中。
例外将是static
阵列。
呵呵什么?通过查看汇编代码,您可以在运行时找出数组驻留在内存中的位置。但是由于数组是一个运行时概念,所以你将无法获得存储在数组中的任何值 - 这是没有道理的。 – 2013-07-27 16:08:37
那么,在ASLR的这一天和这个时代,你至少可以在运行时找到它的存储位置。也就是说,如果你的数组有一个非零的初始值设定项,那么这些数据很可能会在可执行文件的某处找到,是的。 –
我在http://stackoverflow.com/a/30507725/895245做了一个小的重定位教程 –