2015-04-29 27 views
2

给出一个动态链接的ELF二进制文件,比如说/bin/lessLinux ELF文件:如何获取属于导入函数的共享对象

二进制内部,存在要由共享库提供的函数的调用,例如strcpy()

如何可以找出从共享库/共享对象获得strcp功能? 换句话说,我想获得func_name/shared_obj_name.so对。

接听this post,迈克尔·斯莱德说:

ELF文件没有指定哪些符号来自哪个库;它 只是添加一个共享库列表链接到ELF二进制文件,并允许链接程序找到库中的符号。

然而,必须有一种方法来收集所需的信息(使用链接器)。执行二进制和追踪它在我的情况下不是一个选项。我试过到目前为止:

我试图objdump -T /bin/less | grep strcpy这给了我:

0000000000000000  DF *UND* 0000000000000000 GLIBC_2.2.5 strcpy 
0000000000000000  DF *UND* 0000000000000000 GLIBC_2.3.4 __strcpy_chk 

这既不是unambigious也没有给我一个.so文件的名称。

运行ldd /bin/less,返回:

linux-vdso.so.1 => (0x00007ffe8b7fa000) 
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f92c23a5000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92c1fe0000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f92c25ec000)) 

让我觉得 “GLIBC_2.2.5” 对应libc.so.6

我如何以编程方式找到相应的共享对象(.so文件)到(导入)功能?

回答

2

如何从共享库/共享对象中找到strcp函数?

一般而言,您不能:该库可以在运行时更改。例如,如果我编译以下来源:

int strcpy(char *a, const char *src) { abort(); } 

$ gcc -fPIC -shared -o foo.so foo.c 

,然后运行您的程序,像这样:

LD_PRELOAD=./foo.so /bin/less 

然后从中获取strcpy库是foo.so。使用LD_PRELOAD这种方式称为库间插,在各种circumstances中有用。

还有其他方法可以将注入除了LD_PRELOAD之外还有一个不同的库。

如果你是而不是使用任何这样的机制,并且正在使用GLIBC,那么你可以要求动态加载器为你回答这个问题。这里有一种方法:

LD_DEBUG=bindings ldd -r /bin/less < /dev/null |& egrep '\Wstrcpy\W' 
    26623: binding file /bin/bash [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GLIBC_2.2.5] 
    26633: binding file /lib/x86_64-linux-gnu/libtinfo.so.5 [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GLIBC_2.2.5] 
    26633: binding file /bin/less [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GLIBC_2.2.5] 

上面可以看到,ldd调用bashless作为独立的进程,两者的结合libc.so.6这个特殊符号。

相关问题