From 3b6a654ccf3243ff3fe060ad5fc2c74828a88985 Mon Sep 17 00:00:00 2001 From: firmianay Date: Tue, 19 Sep 2017 22:01:26 +0800 Subject: [PATCH] update dynamic link --- doc/1.5.6_dynamic_link.md | 66 ++++++++++++++++++++++++++++++++++ doc/4.2_Linux_terminal_tips.md | 12 +++++++ doc/6.1_Linuxtools.md | 3 ++ 3 files changed, 81 insertions(+) diff --git a/doc/1.5.6_dynamic_link.md b/doc/1.5.6_dynamic_link.md index 2f3658d..2072e42 100644 --- a/doc/1.5.6_dynamic_link.md +++ b/doc/1.5.6_dynamic_link.md @@ -1 +1,67 @@ # 动态链接 + +- [动态链接相关的环境变量](#动态链接相关的环境变量) + + +## 动态链接相关的环境变量 +#### LD_PRELOAD +LD_PRELOAD 环境变量可以定义在程序运行前优先加载的动态链接库。这使得我们可以有选择性地加载不同动态链接库中的相同函数,即通过设置该变量,在主程序和其动态链接库中间加载别的动态链接库,甚至覆盖原本的库。这就有可能出现劫持程序执行的安全问题。 + +```c +#include +#include +void main() { + char passwd[] = "password"; + char str[128]; + + scanf("%s", &str); + if (!strcmp(passwd, str)) { + printf("correct\n"); + return; + } + printf("invalid\n"); +} +``` +下面我们构造一个恶意的动态链接库来重载 `strcmp()` 函数,编译为动态链接库,并设置 LD_PRELOAD 环境变量: +``` +$ cat hack.c +#include +#include +int strcmp(const char *s1, const char *s2) { + printf("hacked\n"); + return 0; +} +$ gcc -shared -o hack.so hack.c +$ gcc ldpreload.c +$ ./a.out +asdf +invalid +$ LD_PRELOAD="./hack.so" ./a.out +asdf +hacked +correct +``` + +#### LD_SHOW_AUXV +AUXV 是内核在执行 ELF 文件时传递给用户空间的信息,设置该环境变量可以显示这些信息。如: +```text +$ LD_SHOW_AUXV=1 ls +AT_SYSINFO_EHDR: 0x7fff41fbc000 +AT_HWCAP: bfebfbff +AT_PAGESZ: 4096 +AT_CLKTCK: 100 +AT_PHDR: 0x55f1f623e040 +AT_PHENT: 56 +AT_PHNUM: 9 +AT_BASE: 0x7f277e1ec000 +AT_FLAGS: 0x0 +AT_ENTRY: 0x55f1f6243060 +AT_UID: 1000 +AT_EUID: 1000 +AT_GID: 1000 +AT_EGID: 1000 +AT_SECURE: 0 +AT_RANDOM: 0x7fff41effbb9 +AT_EXECFN: /usr/bin/ls +AT_PLATFORM: x86_64 +``` diff --git a/doc/4.2_Linux_terminal_tips.md b/doc/4.2_Linux_terminal_tips.md index 021da67..f990216 100644 --- a/doc/4.2_Linux_terminal_tips.md +++ b/doc/4.2_Linux_terminal_tips.md @@ -98,6 +98,18 @@ ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsysca - **节点**:映像文件的节点号 - **路径**: 映像文件的路径,经常同一个地址有两个地址范围,那是因为一段是 `r-xp` 为只读的代码段,一段是 `rwxp` 为可读写的数据段 +除了 `/proc//maps` 之外,还有一些有用的设备和文件。 +- `/proc/kcore` 是 Linux 内核运行时的动态 core 文件。它是一个原始的内存转储,以 ELF core 文件的形式呈现,可以使用 GDB 来调试和分析内核。 +- `/boot/System.map` 是一个特定内核的内核符号表。它是你当前运行的内核的 System.map 的链接。 +- `/proc/kallsyms` 和 `System.map` 很类似,但它在 `/proc` 目录下,所以是由内核维护的,并可以动态更新。 +- `/proc/iomem` 和 `/proc//maps` 类似,但它是用于系统内存的。如: + ``` + # cat /proc/iomem | grep Kernel + 01000000-01622d91 : Kernel code + 01622d92-01b0ddff : Kernel data + 01c56000-01d57fff : Kernel bss + ``` + ## ASCII 表 ASCII 表将键盘上的所有字符映射到固定的数字。有时候我们可能需要查看这张表: diff --git a/doc/6.1_Linuxtools.md b/doc/6.1_Linuxtools.md index 257181e..2fc86e2 100644 --- a/doc/6.1_Linuxtools.md +++ b/doc/6.1_Linuxtools.md @@ -135,9 +135,12 @@ $ for i in `objdump -d print_flag | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f] #### 重要参数 ```text -h --file-header Display the ELF file header +-e --headers Equivalent to: -h -l -S -l --program-headers Display the program headers -S --section-headers Display the sections' header -s --syms Display the symbol table +-r --relocs Display the relocations (if present) +-d --dynamic Display the dynamic section (if present) ``` #### 常见用法