mirror of
https://github.com/nganhkhoa/CTF-All-In-One.git
synced 2024-12-24 03:01:15 +07:00
update dynamic link
This commit is contained in:
parent
113d2a3d9b
commit
3b6a654ccf
@ -1 +1,67 @@
|
||||
# 动态链接
|
||||
|
||||
- [动态链接相关的环境变量](#动态链接相关的环境变量)
|
||||
|
||||
|
||||
## 动态链接相关的环境变量
|
||||
#### LD_PRELOAD
|
||||
LD_PRELOAD 环境变量可以定义在程序运行前优先加载的动态链接库。这使得我们可以有选择性地加载不同动态链接库中的相同函数,即通过设置该变量,在主程序和其动态链接库中间加载别的动态链接库,甚至覆盖原本的库。这就有可能出现劫持程序执行的安全问题。
|
||||
|
||||
```c
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
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<stdio.h>
|
||||
#include<stdio.h>
|
||||
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
|
||||
```
|
||||
|
@ -98,6 +98,18 @@ ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsysca
|
||||
- **节点**:映像文件的节点号
|
||||
- **路径**: 映像文件的路径,经常同一个地址有两个地址范围,那是因为一段是 `r-xp` 为只读的代码段,一段是 `rwxp` 为可读写的数据段
|
||||
|
||||
除了 `/proc/<PID>/maps` 之外,还有一些有用的设备和文件。
|
||||
- `/proc/kcore` 是 Linux 内核运行时的动态 core 文件。它是一个原始的内存转储,以 ELF core 文件的形式呈现,可以使用 GDB 来调试和分析内核。
|
||||
- `/boot/System.map` 是一个特定内核的内核符号表。它是你当前运行的内核的 System.map 的链接。
|
||||
- `/proc/kallsyms` 和 `System.map` 很类似,但它在 `/proc` 目录下,所以是由内核维护的,并可以动态更新。
|
||||
- `/proc/iomem` 和 `/proc/<pid>/maps` 类似,但它是用于系统内存的。如:
|
||||
```
|
||||
# cat /proc/iomem | grep Kernel
|
||||
01000000-01622d91 : Kernel code
|
||||
01622d92-01b0ddff : Kernel data
|
||||
01c56000-01d57fff : Kernel bss
|
||||
```
|
||||
|
||||
|
||||
## ASCII 表
|
||||
ASCII 表将键盘上的所有字符映射到固定的数字。有时候我们可能需要查看这张表:
|
||||
|
@ -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)
|
||||
```
|
||||
|
||||
#### 常见用法
|
||||
|
Loading…
Reference in New Issue
Block a user