1.5.6 动态链接

动态链接相关的环境变量

LD_PRELOAD

LD_PRELOAD 环境变量可以定义在程序运行前优先加载的动态链接库。这使得我们可以有选择性地加载不同动态链接库中的相同函数,即通过设置该变量,在主程序和其动态链接库中间加载别的动态链接库,甚至覆盖原本的库。这就有可能出现劫持程序执行的安全问题。

  1. #include<stdio.h>
  2. #include<string.h>
  3. void main() {
  4. char passwd[] = "password";
  5. char str[128];
  6. scanf("%s", &str);
  7. if (!strcmp(passwd, str)) {
  8. printf("correct\n");
  9. return;
  10. }
  11. printf("invalid\n");
  12. }

下面我们构造一个恶意的动态链接库来重载 strcmp() 函数,编译为动态链接库,并设置 LD_PRELOAD 环境变量:

  1. $ cat hack.c
  2. #include<stdio.h>
  3. #include<stdio.h>
  4. int strcmp(const char *s1, const char *s2) {
  5. printf("hacked\n");
  6. return 0;
  7. }
  8. $ gcc -shared -o hack.so hack.c
  9. $ gcc ldpreload.c
  10. $ ./a.out
  11. asdf
  12. invalid
  13. $ LD_PRELOAD="./hack.so" ./a.out
  14. asdf
  15. hacked
  16. correct

LD_SHOW_AUXV

AUXV 是内核在执行 ELF 文件时传递给用户空间的信息,设置该环境变量可以显示这些信息。如:

  1. $ LD_SHOW_AUXV=1 ls
  2. AT_SYSINFO_EHDR: 0x7fff41fbc000
  3. AT_HWCAP: bfebfbff
  4. AT_PAGESZ: 4096
  5. AT_CLKTCK: 100
  6. AT_PHDR: 0x55f1f623e040
  7. AT_PHENT: 56
  8. AT_PHNUM: 9
  9. AT_BASE: 0x7f277e1ec000
  10. AT_FLAGS: 0x0
  11. AT_ENTRY: 0x55f1f6243060
  12. AT_UID: 1000
  13. AT_EUID: 1000
  14. AT_GID: 1000
  15. AT_EGID: 1000
  16. AT_SECURE: 0
  17. AT_RANDOM: 0x7fff41effbb9
  18. AT_EXECFN: /usr/bin/ls
  19. AT_PLATFORM: x86_64