如果我在一個函數中定義一個本地字符數組,然後使用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做了一個小的重定位教程 –