diff --git a/README.md b/README.md index b184618..c958065 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - [1.5.4 Windows PE](doc/1.5.4_pe.md) - [1.5.5 静态链接](doc/1.5.5_static_link.md) - [1.5.6 动态链接](doc/1.5.6_dynamic_link.md) - - [1.5.7 内存与虚拟内存](doc/1.5.7_memory.md) + - [1.5.7 内存管理](doc/1.5.7_memory.md) - [1.6 密码学基础](doc/1.6_crypto_basic.md) - [1.7 Android 安全基础](doc/1.7_android_basic.md) diff --git a/doc/1.3_linux_basic.md b/doc/1.3_linux_basic.md index 3ce355d..33f7158 100644 --- a/doc/1.3_linux_basic.md +++ b/doc/1.3_linux_basic.md @@ -2,6 +2,7 @@ - [常用基础命令](#常用基础命令) - [进程管理](#进程管理) +- [UID 和 GID](#uid-和-gid) - [权限设置](#权限设置) - [字节序](#字节序) - [输入输出](#输入输出) @@ -47,6 +48,40 @@ nano / vim / emacs 字符终端的文本编辑器 - 删除进程某 PID 指定的进程:`$ kill [PID]` +## UID 和 GID +Linux 是一个支持多用户的操作系统,每个用户都有 User ID(UID) 和 Group ID(GID),UID 是对一个用户的单一身份标识,而 GID 则对应多个 UID。知道某个用户的 UID 和 GID 是非常有用的,一些程序可能就需要 UID/GID 来运行。可以使用 `id` 命令来查看: +```text +$ id root +uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(log) +$ id firmy +uid=1000(firmy) gid=1000(firmy) groups=1000(firmy),3(sys),7(lp),10(wheel),90(network),91(video),93(optical),95(storage),96(scanner),98(power),56(bumblebee) +``` +UID 为 0 的 root 用户类似于系统管理员,它具有系统的完全访问权。我自己新建的用户 firmy,其 UID 为 1000,是一个普通用户。GID 的关系存储在 `/etc/group` 文件中: +```text +$ cat /etc/group +root:x:0:root +bin:x:1:root,bin,daemon +daemon:x:2:root,bin,daemon +sys:x:3:root,bin,firmy +...... +``` +所有用户的信息(除了密码)都保存在 `/etc/passwd` 文件中,而为了安全起见,加密过的用户密码保存在 `/etc/shadow` 文件中,此文件只有 root 权限可以访问。 +```text +$ sudo cat /etc/shadow +root:$6$root$wvK.pRXFEH80GYkpiu1tEWYMOueo4tZtq7mYnldiyJBZDMe.mKwt.WIJnehb4bhZchL/93Oe1ok9UwxYf79yR1:17264:::::: +firmy:$6$firmy$dhGT.WP91lnpG5/10GfGdj5L1fFVSoYlxwYHQn.llc5eKOvr7J8nqqGdVFKykMUSDNxix5Vh8zbXIapt0oPd8.:17264:0:99999:7::: +``` +由于普通用户的权限比较低,这里使用 `sudo` 命令可以让普通用户以 root 用户的身份运行某一命令。使用 `su` 命令则可以切换到一个不同的用户: +```text +$ whoami +firmy +$ su root +# whoami +root +``` +`whoami` 用于打印当前有效的用户名称,shell 中普通用户以 `$` 开头,root 用户以 `#` 开头。在输入密码后,我们已经从 firmy 用户转换到 root 用户了。 + + ## 权限设置 在 Linux 中,文件或目录权限的控制分别以读取、写入、执行 3 种一般权限来区分,另有 3 种特殊权限可供运用。 diff --git a/doc/1.5.2_x86&x64&ARM.md b/doc/1.5.2_x86&x64&ARM.md index d4c4641..7af53ff 100644 --- a/doc/1.5.2_x86&x64&ARM.md +++ b/doc/1.5.2_x86&x64&ARM.md @@ -1 +1,12 @@ -# x86 汇编基础 +# x86/x64/ARM 汇编基础 + +- [x86](#x86) +- [x64](#x64) +- [ARM](#arm) + + +## x86 + +## x64 + +## ARM diff --git a/doc/1.5.7_memory.md b/doc/1.5.7_memory.md index 4cb6b34..6a8fa03 100644 --- a/doc/1.5.7_memory.md +++ b/doc/1.5.7_memory.md @@ -1 +1,30 @@ -# 内存与虚拟内存 +# 内存管理 + +- [什么是内存](#什么是内存) +- [栈与调用约定](#栈与调用约定) +- [堆与内存管理](#堆与内存管理) + + +## 什么是内存 +为了使用户程序在运行时具有一个私有的地址空间、有自己的 CPU,就像独占了整个计算机一样,现代操作系统提出了虚拟内存的概念。 + +虚拟内存的主要作用主要为三个: +- 它将内存看做一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要在磁盘和内存之间来回传送数据。 +- 它为每个进程提供了一致的地址空间。 +- 它保护了每个进程的地址空间不被其他进程破坏。 + +现代操作系统采用虚拟寻址的方式,CPU 通过生成一个虚拟地址(Virtual Address(VA))来访问内存,然后这个虚拟地址通过内存管理单元(Memory Management Unit(MMU))转换成物理地址之后被送到存储器。 + +![](../pic/1.5.7_va.png) + +前面我们已经看到可执行文件被映射到了内存中,Linux 为每个进程维持了一个单独的虚拟地址空间,包括了 .text、.data、.bss、栈(stack)、堆(heap),共享库等内容。 + +32 位系统有 4GB 的地址空间,其中 0x08048000~0xbfffffff 是用户空间(3GB),0xc0000000~0xffffffff 是内核空间(1GB)。 + +![](../pic/1.5.7_vm.png) + + +## 栈与调用约定 + + +## 堆与内存管理 diff --git a/doc/1_basic.md b/doc/1_basic.md index aecb626..6f58e1f 100644 --- a/doc/1_basic.md +++ b/doc/1_basic.md @@ -11,6 +11,6 @@ - [1.5.4 Windows PE](1.5.4_pe.md) - [1.5.5 静态链接](1.5.5_static_link.md) - [1.5.6 动态链接](1.5.6_dynamic_link.md) - - [1.5.7 内存与虚拟内存](1.5.7_memory.md) + - [1.5.7 内存管理](1.5.7_memory.md) - [1.6 密码学基础](1.6_crypto_basic.md) - [1.7 Android 安全基础](1.7_android_basic.md) diff --git a/doc/4.2_Linux_terminal_tips.md b/doc/4.2_Linux_terminal_tips.md index 2591e32..43ac5a6 100644 --- a/doc/4.2_Linux_terminal_tips.md +++ b/doc/4.2_Linux_terminal_tips.md @@ -3,6 +3,7 @@ - [重定向输入字符](#重定向输入字符) - [从可执行文件中提取 shellcode](#从可执行文件中提取-shellcode) - [查看进程虚拟地址空间](#查看进程虚拟地址空间) +- [ASCII 表](#ascii-表) ## 重定向输入字符 @@ -95,3 +96,100 @@ ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsysca - **设备**:映像文件的主设备号和次设备号,可以通过通过 `cat /proc/devices` 查看设备号对应的设备名 - **节点**:映像文件的节点号 - **路径**: 映像文件的路径,经常同一个地址有两个地址范围,那是因为一段是 `r-xp` 为只读的代码段,一段是 `rwxp` 为可读写的数据段 + + +## ASCII 表 +ASCII 表将键盘上的所有字符映射到固定的数字。有时候我们可能需要查看这张表: +```text +$ man ascii + +Oct Dec Hex Char Oct Dec Hex Char +──────────────────────────────────────────────────────────────────────── +000 0 00 NUL '\0' (null character) 100 64 40 @ +001 1 01 SOH (start of heading) 101 65 41 A +002 2 02 STX (start of text) 102 66 42 B +003 3 03 ETX (end of text) 103 67 43 C +004 4 04 EOT (end of transmission) 104 68 44 D +005 5 05 ENQ (enquiry) 105 69 45 E +006 6 06 ACK (acknowledge) 106 70 46 F +007 7 07 BEL '\a' (bell) 107 71 47 G +010 8 08 BS '\b' (backspace) 110 72 48 H +011 9 09 HT '\t' (horizontal tab) 111 73 49 I +012 10 0A LF '\n' (new line) 112 74 4A J +013 11 0B VT '\v' (vertical tab) 113 75 4B K +014 12 0C FF '\f' (form feed) 114 76 4C L +015 13 0D CR '\r' (carriage ret) 115 77 4D M +016 14 0E SO (shift out) 116 78 4E N +017 15 0F SI (shift in) 117 79 4F O +020 16 10 DLE (data link escape) 120 80 50 P +021 17 11 DC1 (device control 1) 121 81 51 Q +022 18 12 DC2 (device control 2) 122 82 52 R +023 19 13 DC3 (device control 3) 123 83 53 S +024 20 14 DC4 (device control 4) 124 84 54 T +025 21 15 NAK (negative ack.) 125 85 55 U +026 22 16 SYN (synchronous idle) 126 86 56 V +027 23 17 ETB (end of trans. blk) 127 87 57 W +030 24 18 CAN (cancel) 130 88 58 X +031 25 19 EM (end of medium) 131 89 59 Y +032 26 1A SUB (substitute) 132 90 5A Z +033 27 1B ESC (escape) 133 91 5B [ +034 28 1C FS (file separator) 134 92 5C \ '\\' +035 29 1D GS (group separator) 135 93 5D ] +036 30 1E RS (record separator) 136 94 5E ^ +037 31 1F US (unit separator) 137 95 5F _ +040 32 20 SPACE 140 96 60 ` +041 33 21 ! 141 97 61 a +042 34 22 " 142 98 62 b +043 35 23 # 143 99 63 c +044 36 24 $ 144 100 64 d +045 37 25 % 145 101 65 e +046 38 26 & 146 102 66 f +047 39 27 ' 147 103 67 g +050 40 28 ( 150 104 68 h +051 41 29 ) 151 105 69 i +052 42 2A * 152 106 6A j +053 43 2B + 153 107 6B k +054 44 2C , 154 108 6C l +055 45 2D - 155 109 6D m + +056 46 2E . 156 110 6E n +057 47 2F / 157 111 6F o +060 48 30 0 160 112 70 p +061 49 31 1 161 113 71 q +062 50 32 2 162 114 72 r +063 51 33 3 163 115 73 s +064 52 34 4 164 116 74 t +065 53 35 5 165 117 75 u +066 54 36 6 166 118 76 v +067 55 37 7 167 119 77 w +070 56 38 8 170 120 78 x +071 57 39 9 171 121 79 y +072 58 3A : 172 122 7A z +073 59 3B ; 173 123 7B { +074 60 3C < 174 124 7C | +075 61 3D = 175 125 7D } +076 62 3E > 176 126 7E ~ +077 63 3F ? 177 127 7F DEL + +Tables +For convenience, below are more compact tables in hex and decimal. + + 2 3 4 5 6 7 30 40 50 60 70 80 90 100 110 120 + ------------- --------------------------------- +0: 0 @ P ` p 0: ( 2 < F P Z d n x +1: ! 1 A Q a q 1: ) 3 = G Q [ e o y +2: " 2 B R b r 2: * 4 > H R \ f p z +3: # 3 C S c s 3: ! + 5 ? I S ] g q { +4: $ 4 D T d t 4: " , 6 @ J T ^ h r | +5: % 5 E U e u 5: # - 7 A K U _ i s } +6: & 6 F V f v 6: $ . 8 B L V ` j t ~ +7: ' 7 G W g w 7: % / 9 C M W a k u DEL +8: ( 8 H X h x 8: & 0 : D N X b l v +9: ) 9 I Y i y 9: ' 1 ; E O Y c m w +A: * : J Z j z +B: + ; K [ k { +C: , < L \ l | +D: - = M ] m } +E: . > N ^ n ~ +F: / ? O _ o DEL +``` diff --git a/pic/1.5.7_va.png b/pic/1.5.7_va.png new file mode 100644 index 0000000..0f819f3 Binary files /dev/null and b/pic/1.5.7_va.png differ diff --git a/pic/1.5.7_vm.png b/pic/1.5.7_vm.png new file mode 100644 index 0000000..8531545 Binary files /dev/null and b/pic/1.5.7_vm.png differ