使用objdump命令查看elf文件
objdump -x 查看elf文件所有头部的信息
所有的elf文件。 程序头部(Program Header)中,都以 PT_PHDR和PT_INTERP先开始。这两个段必须在所有可加载段项目的前面。
从上图中的INTERP段中,可以看到改段从 0x318位置处开始加载,长度为0x1C。
我们使用 hexdump 命令查看elf文件的二进制内容。
找到0x318位置
6c2f 6269 3436 6c2f 2d64 696c 756e 2d78 3878 2d36 3436 732e 2e6f 0032
|/ bi 46 |/ - d i | un -x 8 x -6 4 6 s . . o 2
通过比对ascii码,可以知道从0x318开始的28个二进制表示的
字符串是: /lib64/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/libc-2.31.so 应该是/usr/lib/x86_64-linux-gnu/ld-2.31.so加载的。
参考视频: elf文件格式
#include<stdlib.h>
#include<stdio.h>
//#include "b.c"
int uninitiallized;
char* initialized = "I'm here";
int glb_arr[]={1,2,3,4};
int cmp(int a, int b){
return a >= b ? a : b;
}
void main(){
void * ptr = malloc(0x10);
static int stc = 2;
ptr = malloc(0x10);
const int cst = 0xab;
cmp(1,2);
printf("end\n");
}
第一次调用到malloc函数时, 跳转到 malloc@plt, 然后跳转到malloc@got, 从got表得到偏移,从而跳转到偏移地址处,从而再去调用resolve函数获取malloc的绝对地址。
got表中, 最开始指向都是偏移地址,如下 puts@glt指向的偏移是 0x555555555036.
malloc@got指向的偏移是 0x555555555036.
调用resolve函数获取malloc的绝对地址,0x7ffff7e5e700. 并将该地址放到got表中。下次调用malloc直接用这个地址即可。不需要再次调用resolve函数获取地址。
puts@plt,malloc@plt都会调用resolve函数,因此,下图中的右上角的地址是一样的。