我想为术语和可能的愚蠢问题道歉,我是C ++和OS架构的新手。
我有一个为x86 32bit编译的library.so文件,我需要使用一个函数。在IDA的帮助下,我知道函数的符号和名称及其参数。
我创建了一个带有dlopen()
调用的.cpp文件来导入库,然后通过名称获取指向函数的指针,最后,使用两个参数调用lib中的函数:"4d"
,"13a7330873d6e062"
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
char * (*cipher)(const char *,const char *);
char *error;
handle = dlopen ("/path/to/library.so", RTLD_LAZY);
if (!handle) {
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
cipher = (char * (*)(const char *,const char *)) dlsym(handle, "known_function_name");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%s\n", (*cipher)("4d","13a7330873d6e062"));
dlclose(handle);
return 0;
}
然后我尝试使用g ++ - 4.6编译它(因为我在lib的内容中看到它是使用gcc 4.6编译的),并带有以下选项:
g++-4.6 -o test test.cpp -ldl
它编译时没有任何警告/错误,但是当我启动./test时,我得到了:
/usr/lib/i386-linux-gnu/libc.so: invalid ELF header
如果我尝试做readelf -h /usr/lib/i386-linux-gnu/libc.so,我会得到类似&#34;无法读取0x2074字节的节标题...不是ELF文件&#34;。好的,如果我对/lib/i386-linux-gnu/libc.so.6做一个符号链接,那么它读起来很好,但是当我再次启动文件时:
/path/to/library.so: undefined symbol: __stack_chk_guard
如果我尝试将.so文件导入Java测试类代码,我会得到完全相同的消息。
问题是:如何在知道函数签名的情况下将.so库正确导入到我的程序中。我没有图书馆的头文件。
由于
更新:我试图放
void *__stack_chk_guard;
进入我的test.cpp文件(如果我理解正确的话)并使用-fstack-protector
选项重新编译它,但它没有帮助,我还没有得到
/path/to/library.so: undefined symbol: __stack_chk_guard
另外:它对我当前的/usr/lib/i386-linux-gnu/libc.so进行了很好的编译,但是当我启动它时,它就像我之前所说的那样抱怨它:
/usr/lib/i386-linux-gnu/libc.so: invalid ELF header
如果我备份并制作符号链接/usr/lib/i386-linux-gnu/libc.so - &gt; /lib/i386-linux-gnu/libc.so.6,然后它不会编译:
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
collect2: ld returned 1 exit status
然后用
运行/path/to/library.so: undefined symbol: __stack_chk_guard
答案 0 :(得分:0)
验证,该library.so已正确加载所有依赖项。如果您使用的是不同的库,则可能没有__stack_chk_guard。检查ldd和其他工具。
btw __stack_chk_guard在x86架构上不是很受欢迎......