在linux系统上,程序运行时有一个特征。在程序加载前,系统会预先加载一系列库函数。如果程序运行后,它再使用动态链接库时,如果它调用链接库里面的函数名与预先加载的函数库中的某个函数名相同,那么系统会自动调用预先加载函数库中的函数。
这种机制给与我们一个劫持程序运行的入口。例如函数从某个动态加载的so链接库里调用名为function_name的函数,那么我们可以先设置一个链接库,在里面也导出一个同名函数function_name,然后使用修改系统的环境变量LD_PRELOAD,让程序在运行前先加载我们的链接库,等函数运行后它会加载相应动态链接库,并调用里面的函数function_name,结果程序执行时运行的就会变成我们自己预先设置的函数function_name,我们看一个例子:
代码语言:javascript复制int main(int argc, char* argv[]) {
char* buf;
unsigned long len;
if (argc != 3) {
return 1;
}
len = stroul(argv[1], NULL, 0);
printf("Allocating %lu bytesn", len);
buf = malloc(len)
if (buf && len > 0) {
memset(buf, 0, len);
strcpy(buf, argv[2]);
printf("%sn", buf);
free(buf);
}
return 0
}