Elf

如何在二进制文件中查找全局变量的值

published on
背景 从二进制文件中找出一个初始化了的全局变量的值。 原理 初始化的全局变量的值,一定是在可执行文件中的,就看怎么定位到这个地址了。 环境说明 可执行二进制文件为linux下elf文件格式。二进制文件的符号表没被删除,并且知道这个全局变量名。 方法 先在文件中找到这个变量的地址。 readelf -s prob |grep accessID 319: 0000000000cf2610 16 OBJECT GLOBAL DEFAULT 9 main.accessID 4414: 00000000009ad660 17 OBJECT GLOBAL DEFAULT 2 main.accessID.str prob为二进制文件名,accessID就是我想知道的全局变量名,readelf -s 查看prob的符号表,找到accessID 这个 变量。 从符号名上应该能看出第二条记录是 我们需要的:(实际应该从第一条记录去找,因为我知道这个变量是个字符串,所以这个变量的值 应该是个地址,而这个地址里的内容才是真正的 字符串值。 经验证,0xcf2610这个地址的内容就是0x9ad660) * 名称 -> main.accessID.str * 内存地址 -> 0x9ad660 * size -> 17 字节 但是0x9ad660这个地址是 应用加载进内存之后,在内存中的地址,并不是在二进制文件中的地址。 找到变量在文件 中相对与文件头的偏移 readelf -S prob There are 24 section headers, starting at offset 0x1c8: Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] . Read More...