将ELF二进制文件与c程序链接
如果只允许访问独立的ELF程序,我希望能够从自己的程序中调用程序中的函数。 假设下面的代码是将ELF二进制文件与c程序链接,c,gcc,linker,ld,elf,C,Gcc,Linker,Ld,Elf,如果只允许访问独立的ELF程序,我希望能够从自己的程序中调用程序中的函数。 假设下面的代码是main.c #include <stdio.h> extern int mystery(int a,int b); int main() { int a = 0; int b = 1; printf("mystery(a,b) = %d\n",mystery(a,b)); return 0; } 但是,这给了我一个未定义的
main.c
#include <stdio.h>
extern int mystery(int a,int b);
int main() {
int a = 0;
int b = 1;
printf("mystery(a,b) = %d\n",mystery(a,b));
return 0;
}
但是,这给了我一个未定义的对谜团的引用错误
。我一直在寻找方法
在论坛上发现无法将此elf文件转换为共享对象文件。我还研究了如何使用
gcc -c main.c
然后使用ld
将elf链接到main.o
,但我不知道该怎么做。elf是32位的,但我省略了-m32
标志。如果ld
的标志不同,请告诉我。任何帮助都将不胜感激
编辑:
readelf-h非我的程序的输出
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x10e0
Start of program headers: 52 (bytes into file)
Start of section headers: 15116 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 11
Size of section headers: 40 (bytes)
Number of section headers: 30
Section header string table index: 29
如果只允许访问独立的ELF程序,我希望能够从自己的程序调用程序中的函数
听起来你好像有一个朋友
虽然您的愿望在技术上是可能的,但实现这一点的难度大约是您迄今为止尝试的1000倍。如果你不准备花一两个月的时间来解决这个问题,你应该寻找其他的解决方案
实际上,您必须编写一个自定义ELF加载器,将not_my_program
加载到内存中并对其进行初始化,然后调用summary
而不是main
还要注意的是,summary
可能依赖于全局数据,并且数据可能在main
中初始化,因此不能保证在main
之前调用summary
时会工作
另外,从调试器调用
神秘
是否足够?这可以在30秒钟内完成。这种老套的方法适用于一个非常简单的案例
[ aquila ~ ] $ cat 1.c
int func (int a) { return a * (a-1) ; }
int main(int argc) { return func (argc) ; }
[ aquila ~ ] $ cc 1.c
[ aquila ~ ] $ ./a.out ; echo $?
0
[ aquila ~ ] $ readelf -s a.out | grep func
43: 0000000000400487 19 FUNC GLOBAL DEFAULT 11 func
[ aquila ~ ] $ cat 2.c
#include <stdlib.h>
static __attribute__((constructor)) void main() {
int (*func)() = (int (*)())0x0000000000400487;
exit(func(3));
}
[ aquila ~ ] $ cc -fPIC -shared 2.c -o a.so
[ aquila ~ ] $ LD_PRELOAD=./a.so ./a.out ; echo $?
6
[aquila~]$cat 1.c
int func(int a){返回a*(a-1);}
int main(int argc){return func(argc);}
[aquila~]$cc 1.c
[阿奎拉~]$/年;回声$?
0
[aquila~]$readelf-s a.out | grep func
43:0000000000 400487 19 FUNC全局默认值11 FUNC
[aquila~]$cat 2.c
#包括
静态uuu属性uuu((构造函数))void main(){
int(*func)(=(int(*)()0x000000000040487;
退出(职能(3));
}
[aquila~]$cc-fPIC-shared 2.c-o a.so
[aquila~]$LD_PRELOAD=./a.so./a.out;回声$?
6.
c中的调用者被构造成一个带出口的构造函数,这样就不会调用主程序的
main()
,试图限制调用者和func()
本身以外的代码的执行。返回值为6而不是0表示调用已工作,并且主程序的main()
没有被调用。如何生成不是我的程序
的?gcc不是我的程序main.c工作吗?每个elf文件的readelf-h
输出是什么?@Eraklon我在problem@KamilCuk不是我的程序
我相信最初是一个c程序。但是,我没有访问源代码的权限。尝试使用gcc main.c not_my_program-m32
或gcc-c main.c-o main.o-m32
和gcc main.o not_my_program-o my_program
进行编译……甚至可能在这里添加-m32
。只是猜测而已。先生,你有可怕的知识和解决问题的能力。非常感谢,这将完成工作。
[ aquila ~ ] $ cat 1.c
int func (int a) { return a * (a-1) ; }
int main(int argc) { return func (argc) ; }
[ aquila ~ ] $ cc 1.c
[ aquila ~ ] $ ./a.out ; echo $?
0
[ aquila ~ ] $ readelf -s a.out | grep func
43: 0000000000400487 19 FUNC GLOBAL DEFAULT 11 func
[ aquila ~ ] $ cat 2.c
#include <stdlib.h>
static __attribute__((constructor)) void main() {
int (*func)() = (int (*)())0x0000000000400487;
exit(func(3));
}
[ aquila ~ ] $ cc -fPIC -shared 2.c -o a.so
[ aquila ~ ] $ LD_PRELOAD=./a.so ./a.out ; echo $?
6