learn vimchapter 0:h :help cmd 查看具体命令，特别的如果想查看 insert 状态下某个命令，应该是 :h i_cmd:w 直接保存，但是 :w :write new_file_name.txt 会将其另存为一些指令并不需要记得很清楚，不记得了就 :h cmd，并且使用 tab 自动补全chapter 1当通过 vim file1 file2 打开多个文件时，使用 :buffer :b filex 来切换不同文件vim 支持打开文件后立即执行 cmd，例如 vim file +version 以及 vim +version file 则使用 vim 打开文件 file 后将自动执行 :version 指令；还可以使用 vim -c version file 来代替 + 号:substitue :s 用于替换文本，基本表达式如下：:[范围]s/被替换值（或正则表达式）/替换值/[flag]，后续第 12 章会有详细介绍打开多个窗口：vim -o5 file1 file2 用于打开 5 个水平分割的窗口，vim -O2 大写的用于打开 2 个垂直分割的窗口，打开窗口可以用鼠标点击来切换工作窗口在 unix 下可以通过 ctrl + z、:suspend、:stop 直接挂起当前 vim 编写进程，使用 fg 可以恢复该进程chapter 2接 4，输入 :buffers :ls :files 可以查看当前打开的所有 buffer，输入 :buffer filename 或 :buffer 文件对应编号num 可以打开对应文件，也可以使用快捷指令 :bp :bprevious 或者 :bn :bnext 快速切换上下文件；输入 :bdelete 来删除当前 buffer，如果指定了数字或者文件名则删除对应 buffervim 的 buffers 设计是为了一次性修改多个文件，可以通过 :wqall 来保存并退出所有 buffer:split 主要的作用是创建 windows，当已经打开了一个文件时，此时再 :split <filename> 即可将当前 terminal 分割成上下两个窗口，并在另一个窗口显示 filename 的内容，如果不指定文件名就是将当前 buffer 分割两个 windows，:vsplit 对应左右两个窗口crtl + w + H J K L，这里的 w 就是 windows，用于直觉地切换不同的窗口（但是由于自己设置了 ctrl + w 等于关闭当前终端，因此该方式对 vim 无效，但是对 gvim 有效），还可以选择通过 mouse 来切换窗口；ctrl + w [options]，v 打开一个新的垂直窗口、s 打开新的水平窗口、c 关闭当前窗口、o 关闭除了当前窗口以外所有的窗口:tabnew filename，就是新开一个选项卡并装载 filename，类似的还有：:tabclose 关闭当前 tab，:tabnext :tabpreview :tablast :tabfirst 下一个、前一个、最后一个、第一个 tab 选项卡；如果想让 vim 在启动时打开多个选项卡，则 vim -p file1 file2 file3chapter 3:edit filename 用于编辑文件，如果文件不存在，则会新建之，也可以 tab 自动列出所有文件然后选择之；:edit *.md，然后 tab 即可自动列出所有 .md 的文件供选择；:edit **/*.md 然后 tab 可以递归当前目录下所有文件找到这些 .md 文件；如果只是 :edit . 传入目录，则将启动 netrw，即 vim 自己的文件浏览器，然后可以选择目录和文件:find 指令主要用于根据 :set path? 所返回的路径进行查找，一般来说会引入特定的环境变量，例如引入 /usr/include 可以查找 c 编译器头文件目录，则执行 :find filename 后可以在这些目录下进行查找；添加新的 path 可以按照这个方法：:set path+=/path/want/to/add，在进行一些大的项目开发时，可以按照 :set path+=$PWD/** 的方法将整个项目的路径引入，这样在 find 时可以找到想要的文件了grep 查找内容，有两种方式：:vim :vimgrep 是 vim 内置的 grep，而 :grep 是外置的 grep，基本语法与 grep --help 的语法一致，即 grep /pattern/ filename，这样会打开一个 quickfix 窗口，主要有有以下命令: :copen :cclose :cnext :cpreviousvim 内置文件浏览器 netrw，主要有以下用法：:Explore 直接打开浏览器，:Sexplore 打开一个垂直窗口文件浏览器，:Vexplore 打开一个水平窗口文件浏览器；在 netrw 中有几个命令：% 创建新文件、d 创建新目录、R 重命名文件或目录、D 删除文件或目录fzf，一个通用的模糊匹配器，参照 diy/readme.md 安装插件，安装完成后输入 :Files 可以获取到该指令，以下是 fzf 的基础语法：^welcom 前缀精确匹配，返回 welcomedown$ 后缀精确匹配，返回 markdown'welcome to markdown 表示整句精确匹配，返回 welcome to markdownwelcome | markdown 表示 或 语法，尽可能返回 welcome 和 markdownwelcome !markdown 表示 非 语法，返回不含 markdown 的 welcome xxx 短语搭配以上插件进行搜索并替换，<leader>bd（自定义的按键映射，原理是 :bufdo bd |e#）关闭所有 buffer，然后重新打开当前 buffer，ctrl + f 使用 fzf 的 选择要打开的 buffer，然后 :buffer %s/被替换/替换值/g | update 一次性将所选的 buffer 中的指定值进行替换chapter 4motion，vim 中的动作，有点反人类：k，上j，下h，左l，右上下左右，科技含量，kjhlw，下一个单词 word}，下一个段落$，行尾e，下一个单词的结尾b，上一个单词的开始operator，操作符y，yank 复制p，paste 粘贴，P 大写的是光标前的，p 小写的是光标后的，这和许多操作符的前后逻辑类似d，delete 删除c，change 原意是修改文本，表现为删除选中文本，将其存入寄存器，后续可以用 p 粘贴组合技，例如有y$ yank from current to $，即复制从光标当前位置（光标前）开始直到行尾到剪贴板dw delete from current to next word，删除从当前位置开始到下一个 wordc} change text from current to next paragraph，修改从当前位置开始到下一个段落的文本y2h yank 2 positions left from current，向左复制两个字符d2w delete 2 words from current，向后删除两个单词c2j change 2 lines，向下修改两行d5G delete from current line to line 5，将从本行开始到第 5 行的内容全部删除，可以向上也可以向下dta delete to letter a，从当前位置开始，直到 a 之前的字符全部删除另外，重复 dd、yy 和 cc 分别代表 删除该行、复制该行、将该行剪切到寄存器并进入插入模式文本对象操作：i 表示区域内部、a 表示整个区域，假设有以下代码块const hello = function() { console.log("Hello Vim"); return ture; }将光标放在 Hello 的 H 处，di( 将自动定位 "Hello Vim" 然后将其 delete，如果是 da( 则删除整个 ("Hello Vim")，同理还有 di{ 删除整个 {} 里的内容，diw 删除 Hello 这个单词假设又有以下代码块： header1 para1 para2 将光标放置于 header1 的 h，输入 dit 则删除整个 header1，输入 dat 删除 \ header1\ 将光标放置于 div 处，dit 将删除 \ \ 内所有的 h1 和 p，dat 将额外删除 div 整个模块，如果是 di< 则删除 div 这三个字符（和上文的 di( 逻辑类似）输入 :h text-object 获取更多帮助，以下是常见的文本对象：[w]ord、[p]aragraph、[s]entence、(、{、[、<、t 代表 xml 标签、"、'vim motion 和 operator 与 unix 命令结合假设有以下文本：1234 abcd Id|Name|Age 1|Alice|20 2|Bob|22 3|Caddy|19 23212421 asdasca将光标放在 Id 处，然后输入 !}column -t -s "|"：! 的作用可以理解为一个占位符，用于表示后面的指令；} 用于标识命令操作的对象范围，即到下一个段落；column -t -s "|" 是 unix 上的指令，用于通过 "|" 标识来将数据 table 化。以上指令就是相当于将 ! 修改成 column -t -s "|"，然后作用范围是整个段落，结果如下：1234 abcd Id Name Age 1 Alice 20 2 Bob 22 3 Caddy 19 23212421 asdasca像这样，通过 motion 和 operator 相结合：motion 到哪个位置，operator 做什么事，实现强大的文本编辑，更何况 ! 允许调用更多的 unix 指令实现更好的文本处理。以下是引用原文：你知道的动词 操作符，名词 动作，终端命令越多，你组建复杂操作的能力成倍增长。换句话说，假设你只知道四个 动作：w, $, }, G 和删除操作符 d，你可以做 8 件事：按四种方式移动 w, $, }, G 和删除 4 种文本对象 dw, d$, d}, dG；如果有一天你学习了小写变大写的 操作符 gU，你的 Vim 工具箱中多的不是 1 种工具，而是4种：gUw, gU$, gU}, gUG，现在你的 Vim 工具箱中就有12种工具了；如果你知道 10 个 动作 和 5 个 操作符，那么你就有 60 种工具：50 个操作 + 10 个移动。另外，行号动作 nG 给你了 n 种 动作，其中 n 是你文件中的行数：例如前往第 5 行 5G。搜索动作 / 实际上给你带来无限数量的 动作 因为你可以搜索任何内容。你知道多少终端命令，外部命令操作符 ! 就给你了多少种过滤工具。使用 Vim 这种能够组合的工具，所有你知道的东西都可以被串起来完成更复杂的操作。你知道的越多，你就越强大。这种具有结合性的行为也正符合 Unix 的哲学：一个命令做好一件事。动作 只需要做一件事：前往 X。操作符 只需要做一件事：完成 Y。通过结合一个 操作符 和一个 动作，你就获得了 YX：在 X 上完成 Y。chapter 5为什么 Vim 使用 hjkl 进行移动，这实际上是因为 Bill Joy 写 VI 用的 Lear-Siegler ADM-3A 终端没有方向键，而是把 hjkl 当做方向键使用 [num][motion] 来实现快速执行 num 次 motion，例如 12l 则向右移动 12 次，6j 则向下移动 6 line，7k 向上移动 7 line；在 vimrc 中设定 set relativenumber 可以开启相对行号，可以直接看到其他行相对于当前行的距离，当然也可以使用 16G 直接跳转到第 16 line词组（WORD），相对于单词（word）。二者的区分在于，单词指的是一个只包含 a-zA-Z0-9 的字符串，遇到不同类型的就会被视作两个单词；但是一个词组使用 space、tab、EOL 进行分割，参照以下内容：const WORD = "Hello_Vim";将光标放在段落首的 c 处，需要 24l 才可以到段尾，6w 到段尾，而只需要 4W 到段尾当前行导航：当前行内导航有以下操作：0、^、g_、$、n| 分别表示跳到本行：第 1 个字符、第一个非空字符、最后一个非空字符、最后一个字符、第 n 列当前行内检索（也可以视作根据检索词跳转）：f、F、t、T、;、, 分别表示在本行：向后搜索、向前搜索、向后搜索、向前搜索、重复近一次搜索、相反方向地重复近一次搜索，即大写向前，小写向后，fF 是定位到那个字符，tT 是定位到那个字符前；例如 Ft 会跳转到当前行前边的 tT 处句子和段落的跳转将 .!? 跟着一个 \n、space 或 <tab> 之前的字符集合定为一个句子，使用 ( 和 ) 分别跳转到上一个和下一个句子的开头一个段落以一个空行作为开始和结尾，使用 {、} 跳转上下一个段落匹配导航，有以下代码块：(define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))) )))使用 % 可以快速匹配一对括号，还可以安装插件 vim-rainbow 增强文章中的括号体验行号导航使用 gg、G、nG 跳转到第一行、最后一行、第 n 行不清楚要跳转到具体的行号，但是知道大概在文章 70% 的位置，使用 70% 可以直接跳转可以使用 ctrl + g 查看文件总共有多少行窗格导航根据窗口跳转，使用 H、M、L 分别跳转到当前窗口的顶部、中间、底部，大概跳转到这些地方，但是具体的跳转结果通过 :help H 进行参考输入 nH、nL 跳转到举例顶部、底部 n 行的位置窗口滚动使用 ctrl + b、ctrl + f 向上下滚动一个屏幕，不过由于 ctrl + f 被 fzf 注册了，建议使用下面的指令zt、zz、zb 将当前行置于屏幕：顶部、屏幕中央、屏幕底部搜索导航使用 /xxx、?xxx、n、N 实现搜索文本中的 xxx：向后、向前、重复上一个搜索、反向重复上一个搜索使用 /<\hello\> 表示全词匹配，则单个 hello 会被匹配，但是 hello_world 就不会被匹配例如有 hello vim, hello vim2, hello_vim，将光标放在句子首部，使用 *、# 快速向前或向后搜索当前光标指向的文本的单词 hello，如果使用 g*、g# 则会匹配到 hello_vim位置标记导航使用 mx 为当前光标位置设置一个标记，x 可以是 a-zA-Z，然后使用 \`x 跳转到 x 所在的精确位置（行和列），使用 'x 跳转到 x 所在的行；x 小写是文件内标签，X 大写是全局标签（也叫文件标签）使用 :marks 查看所有标签chapter 6进入输入模式的方法i、I，在当前光标之前位置插入、在当前行首插入a、A，在当前光标之后位置插入、在当前行末插入s、S，删除当前光标所指字符并插入、删除当前行并输入o、O，在当前行下方、上方新起一行输入，主要是搭配后面的快速输入达到多行插入的效果gi、gI，从当前缓冲区上次结束输入模式的地方开始输入、在当前行的第一列的位置开始输入输入模式下删除，在输入模式下通过以下快捷键ctrl + h，删除光标前一个字符ctrl + w，删除光标前一个单词ctrl + u，删除光标前直到行首所有内容寄存器模式，可以将目标存储和取出于寄存器中"ayiw，"a 告知将要把后面的操作存放到寄存器 a 中，yiw 表示复制（[y]ank）一个单词（[i]nner [w]ord），组合起来就是将 yiw 操作的结果存放到 a 里使用 ctrl + r a 即可将 a 里的内容粘贴出来输入模式滚动，在输入模式下，ctrl + x 进入 x 模式，然后 ctrl + y e 分别向上、向下滚动页面插入模式执行普通命令，进入 insert 时，左下角显示 insert，此时按下 ctrl + o 变成 (insert)，然后可以输入单个指令，例如 k j h l、a A i I x X 等ctrl + o !! pwd 执行 pwd 指令并插入到当前光标位置ctrl + o zz H/M/L 进行窗口位置的调整ctrl + o dta yta 从当前位置开始直到 a 全部删除、复制chapter 7点命令，重复上一个修改 buffer 的操作例如使用 /test 匹配到 test 字符串，然后输入 cwhello<esc> 这一句是将 test 修改成 hello，然后退出插入模式，随后输入 n 进行下一个匹配，. 会自动重复 cwhello<esc> 的行为；像这样通过 n.n.n. 的方式即可实现 vscode 下的 ctrl + h 逐个替换；当然还有一条指令：cgnhello<esc> 用于快速、可视化地进行替换，并且不再需要按 n，而是自动地跳转到下一个 test例如有以下代码块：zlet zzone = '1'; zlet zztwo = '2'; zlet zzthree = '3'; zlet zzfour = '4';光标放在第一个 z 上，输入 ctrl + v3jd，会将开头的 z 全部删除，然后按下 w 会跳转到第 6 列，此时再 . 即可自动重复 ctrl + v3jd，最终只需要输入 ctrl + v3jdw.w. 即可实现chapter 8接 36，继续描述寄存器模式
Introduction to SGI-STL大多数程序员在面对软件开发时，一直都没有一套公认的标准，例如使用的数据结构和算法规范，导致程序员大量时间花费在重复而无意义的劳动上。程序员应当被视作艺术家，他们应当熟练运用高级语言、汇编语言操纵计算机硬件，实现各种天马行空的想象。whatcpp 标准模板库，The C++ Standard Template Library（STL）被设计出来建立数据结构和算法的一套标准。stl 主要提供 6 大组件容器（containers）：各种数据结构，比如 vector、list、deque、set、map算法（algorithms）：各类算法，比如 sort、search、copy、erase迭代器（iterators）：简单来讲，迭代器提供了一种按顺序逐个访问某一集合的方法，不需要知道集合的具体数据结构，而由迭代器自发地将其获取仿函数（functors）：单个函数不能被直接拿去操作（例如对某个函数排序），仿函数就是一种在函数原有概念上魔改出的函数，这种函数可以被传递给 STL 算法，可以被排序、查找等适配器（adapters）：可用于对上述组件进行魔改，例如拿到一个迭代器，可以制作出一个迭代器适配器（iterator adapter）。原本迭代器是顺序迭代，则 iterator adapter 就可以被魔改成反向迭代、插入迭代等配置器（allocators），用于负责空间配置和管理，即分配堆内存（allocate heap memory）之类的如图 1-1 所示，container 通过 allocator 获取数据存储的空间，algorithm 通过 iterator 存储 container 中的内容，functor 结合 adapter 用于协助 algorithm 实现对 container 进行的各种操作（排序、求和什么的）STL 最初的版本由 Hewlett Packard Company 实现，后续所有 fork 版本都有对应的 HP license 声明。教材着重介绍的是 SGI STL 实现版本，该版本被 gcc 采用，其他的版本还有 P.J.Plauger、Rouge Wave 等，SGL STL 的各种头文件可以在 mingw32 的 include/c++ 目录下找到，主要分为以下几种cpp 标准规范下的 c 头文件，例如 cstdio、cstdlib、cstring 等cpp 标准库中不属于 stl 的文件，例如 stream、string 等stl 标准头文件，例如 vector、list、map 等hp 规范的 stl 头文件，例如 vector.h、deque.h 等sgi stl 文件，例如 stl_vector.h、stl_deque.h 等，教材将基于这些文件教予读者学习
线性代数按照 301 要求的标准复习快速记忆行列式余子式 $M_{ij}=\underline{\hspace{3em}}$，代数余子式 $A_{ij}=\underline{\hspace{3em}}$，行列式的值 $|A|=\underline{\hspace{3em}}$行列式的转置 $\begin{vmatrix}1&2&3\\4&5&6\\7&8&9\\\end{vmatrix}^{-1}=\underline{\hspace{3em}}$，值改变吗？$\underline{\hspace{3em}}$；行列式中任意两行交换 $\begin{vmatrix}1&2\\3&4\end{vmatrix}=\underline{\hspace{3em}}$；行列式中有任意两行相同 $\begin{vmatrix}1&2\\1&2\end{vmatrix}=\underline{\hspace{3em}}$行列式的数乘 $2\begin{vmatrix}1&2\\3&4\end{vmatrix}=\underline{\hspace{3em}}=\underline{\hspace{3em}}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$；推论：行列式中任意两行成比例 $\begin{vmatrix}1&2\\2&4\end{vmatrix}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$行列式的加减 $\begin{vmatrix}1+2&3+4\\5&6\end{vmatrix}=\underline{\hspace{3em}}\stackrel{交换律}{=}\underline{\hspace{3em}}$行列式中某行的倍数与加减 $\begin{vmatrix}1&2\\3&4\end{vmatrix}\stackrel{r_{2}-3r_{1}}{=}\underline{\hspace{3em}}$矩阵矩阵的加法：两个矩阵的形状相同时，$\begin{pmatrix}1&2\\3&4\end{pmatrix}+\begin{pmatrix}5&6\\7&8\end{pmatrix}=\underline{\hspace{3em}}$矩阵的数乘：$2\begin{pmatrix}1&2\\3&4\end{pmatrix}=\underline{\hspace{3em}}$，注意和行列式的数乘区分开矩阵的乘法：$m\times s$ 形状的矩阵乘以 $s\times n$ 形状的矩阵，得到 $\underline{\hspace{3em}}$ 形状的矩阵，表示为 $(m\times s)\cdot(s\times n)=\underline{\hspace{3em}}$；所得矩阵中第 $a_{ij}$ 的值由 $i$ 行和 $j$ 列对应元素相乘再累加；矩阵的乘法有交换律吗？（即 $AB \underline{\hspace{1em}}BA$）分块矩阵分块矩阵 $A=\begin{vmatrix}A&*\\O&B\\\end{vmatrix}$，其中 $A$ 矩阵是 $m$ 阶、$B$ 矩阵是 $n$ 阶的，$*$ 表示任意矩阵，$O$ 表示零矩阵，有以下结论$\begin{vmatrix}A&{*}\\O&B\\\end{vmatrix} = \begin{vmatrix}A&O\\{*}&B\\\end{vmatrix} = \underline{\hspace{3em}}$，$\begin{vmatrix}{*}&A\\B&O\\\end{vmatrix} = \begin{vmatrix}O&A\\B&{*}\\\end{vmatrix} = \underline{\hspace{3em}}$$\begin{pmatrix}A&O\\O&B\\\end{pmatrix}^{n}=\underline{\hspace{3em}}$$\begin{pmatrix}A&O\\O&B\\\end{pmatrix}^{-1}=\underline{\hspace{3em}}$，$\begin{pmatrix}O&A\\B&O\\\end{pmatrix}^{-1}=\underline{\hspace{3em}}$$\begin{pmatrix}\lambda_{1}&O&O\\O&\lambda_{2}&O\\O&O&\lambda_{3}\end{pmatrix}^{-1}=\underline{\hspace{3em}}$，$\begin{pmatrix}\lambda_{1}&O&O\\O&\lambda_{2}&O\\O&O&\lambda_{3}\end{pmatrix}^{n}=\underline{\hspace{3em}}$；分块矩阵的运算$\begin{pmatrix}A_{1}&B_{1}\\C_{1}&D_{1}\\\end{pmatrix}+\begin{pmatrix}A_{2}&B_{2}\\C_{2}&D_{2}\\\end{pmatrix}=\underline{\hspace{3em}}$，$\begin{pmatrix}A_{1}&B_{1}\\C_{1}&D_{1}\\\end{pmatrix}\begin{pmatrix}A_{2}&B_{2}\\C_{2}&D_{2}\\\end{pmatrix}=\underline{\hspace{3em}}$$\lambda\begin{pmatrix}A&B\\C&D\\\end{pmatrix}=\underline{\hspace{3em}}$$\begin{pmatrix}A&B\\C&D\\\end{pmatrix}^{T}=\underline{\hspace{3em}}$转置矩阵、方阵的行列式、伴随矩阵以及逆矩阵矩阵：$A=\begin{pmatrix}1&2\\3&4\\\end{pmatrix}$，转置矩阵：$A^{T}$，行列式（方阵）：$|A|$，伴随矩阵：$A^{*}=\begin{pmatrix}(-1)^{1+1}*4&(-1)^{1+2}*3\\(-1)^{2+1}*2&(-1)^{2+2}*1\\\end{pmatrix}$$(A+B)^{T}=\underline{\hspace{3em}}$，$(\lambda A)^{T}=\underline{\hspace{3em}}$，$(AB)^{T}=\underline{\hspace{3em}}$，若 $\underline{\hspace{3em}}$，则 $A$ 为对称矩阵$|A^{T}|=\underline{\hspace{3em}}$，$|AB|=\underline{\hspace{3em}}$，$|\lambda A|=\underline{\hspace{3em}}$$AA^{*}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$，$|A^{*}|=\underline{\hspace{3em}}$ （与方阵的关系），$(AB)^{*}=\underline{\hspace{3em}}$，$(\lambda A)^{*}=\underline{\hspace{3em}}$，$(A^{*})^{*}=\underline{\hspace{3em}}$若 $AB = E$，则 $A$ 与 $B$ 的关系？$\underline{\hspace{3em}}$；若 $A$ 可逆，则 $|A|$ 要求？$\underline{\hspace{3em}}$；求 $A^{-1}$ 的方法 $\underline{\hspace{3em}}$$(\lambda A)^{-1}=\underline{\hspace{3em}}$，$(AB)^{-1}=\underline{\hspace{3em}}$，$(A^{T})^{-1}=\underline{\hspace{3em}}$，$(A^{*})^{-1}=\underline{\hspace{3em}}$，$|A^{-1}|=\underline{\hspace{3em}}$，$A^{*}=\underline{\hspace{3em}}$利用线性代数解方程基本思想一个简单的二元一次方程组，使用线性代数表示如下$$ \begin{aligned} \begin{equation} \left\{ \begin{aligned} &x + y = 5 \\ &2x - 3y = 12 \end{aligned} \right. \end{equation} \Leftrightarrow \begin{pmatrix}x_{1}+2x_{2}\\2x_{1}-x_{2}\end{pmatrix} = \begin{pmatrix}3\\1\end{pmatrix} \Leftrightarrow \begin{pmatrix}1&2\\2&-1\end{pmatrix} \begin{pmatrix}x_{1}\\x_{2}\end{pmatrix} = \begin{pmatrix}3\\1\end{pmatrix} \Leftrightarrow AX=B \end{aligned} $$此时要求出 $\begin{pmatrix}x_{1}\\x_{2}\end{pmatrix}$，只需要解 $AX=B$ 即可；由 $AX=B\Leftrightarrow A^{-1}\cdot AX=A^{-1}B\Leftrightarrow X=A^{-1}B$；组成 $(A, E)$ 联合矩阵，经过初等变换得出 $A^{-1}$；最后 $X=A^{-1}B$ 即可解出原方程组的解对于 $AX=B$，$A$ 称为系数矩阵，$(A, B)$ 称作增广矩阵，若 $B=\begin{pmatrix}0\\0\end{pmatrix}=0$，则 $AX=B$ 是齐次线性方程组；若 $B\neq0$，则 $AX=B$ 称作非齐次线性方程组行阶梯形、行最简形行阶梯形阶梯线下方全是 $\underline{\hspace{3em}}$；每级阶梯占 $\underline{\hspace{3em}}$ 行，可以占多列；行最简形得是行阶梯形每级阶梯第 $1$ 个元素是 $\underline{\hspace{3em}}$；每级阶梯第 $1$ 个元素所在列的其余元素为 $\underline{\hspace{3em}}$举例如下：$\begin{pmatrix}1&2&3&4\\0&5&6&7\\0&8&0&0\end{pmatrix}$，有 $2$ 个阶梯，$\underline{\hspace{3em}}$ （是/不是）行阶梯形；$\begin{pmatrix}1&2&3&4\\0&0&6&7\\0&1&0&0\end{pmatrix}$，阶梯线下方不全为 $0$，$\underline{\hspace{3em}}$ （是/不是）行阶梯形；$\begin{pmatrix}1&2&3&4\\0&5&6&7\\0&0&8&9\end{pmatrix}$，$\underline{\hspace{3em}}$ （是/不是）行阶梯形；$\begin{pmatrix}1&2&3&4\\0&0&5&6\\0&0&0&0\end{pmatrix}$，$\underline{\hspace{3em}}$ （是/不是）行阶梯形；$\begin{pmatrix}1&2&0&3\\0&0&1&4\\0&0&0&0\end{pmatrix}$，$\underline{\hspace{3em}}$ （是/不是）行阶梯形，$\underline{\hspace{3em}}$ （是/不是）行最简形；解齐次线性方程组一个多元齐次线性方程组 $\begin{equation}\left\{\begin{aligned}&x_{1}+x_{2}-x_{4}=0\\&2x_{1}+x_{2}+2x_{3}-2x_{4}=0\\&3x_{1}+2x_{2}+2x_{3}-3x_{4}=0\end{aligned}\right.\end{equation}$，其解法如下：写出系数矩阵 $A=\begin{pmatrix}1&1&0&-1\\2&1&2&-2\\3&2&2&-3\end{pmatrix}$；将 $A$ 通过初等行变换转为行最简形（过程略，自行尝试），$\begin{pmatrix}1&0&2&-1\\0&1&-2&0\\0&0&0&0\end{pmatrix}$；行最简形转为方程组：$\begin{equation}\left\{\begin{aligned}&x_{1}+2x_{3}-x_{4}=0\\&x_{2}-2x_{3}=0\end{aligned}\right.\end{equation}$，用 $x_{3}$、$x_{4}$ 表示 $x_{1}$、$x_{2}$ 得 $\begin{equation}\left\{\begin{aligned}&x_{1}=-2x_{3}+x_{4}\\&x_{2}=2x_{3}+0x_{4}\end{aligned}\right.\end{equation}$；假设与通解：令 $x_{3}=k_{1}$，$x_{4}=k_{2}$，则通解表示为 $\begin{pmatrix}x_{1}\\x_{2}\\x_{3}\\x_{4}\end{pmatrix}=k_{1}\begin{pmatrix}-2\\2\\1\\0\end{pmatrix}+k_{2}\begin{pmatrix}1\\0\\0\\1\end{pmatrix}$，也可以理解为式子中含有几个 $x_{3}$、$x_{4}$基础解系（也即最终目标）为：$(-2, 2, 1, 0)^{T}$、$(1, 0, 0, 1)^{T}$解非齐次线性方程组一个多元非齐次线性方程组 $\begin{equation}\left\{\begin{aligned}&x_{1}+x_{2}-x_{4}=2\\&2x_{1}+x_{2}+2x_{3}-2x_{4}=5\\&3x_{1}+2x_{2}+2x_{3}-3x_{4}=7\end{aligned}\right.\end{equation}$，其解法如下：先求出增广矩阵 $(A, B)=\begin{pmatrix}1&1&0&-1&2\\2&1&2&-2&5\\3&2&2&-3&7\end{pmatrix}$；化成行最简形：$\begin{pmatrix}1&0&2&-1&3\\0&1&-2&0&-1\\0&0&0&0&0\end{pmatrix}$；求通解与基础解系；由行最简形可得 $\begin{equation}\left\{\begin{aligned}&x_{1}+2x_{3}-x_{4}=3\\&x_{2}-2x_{3}=-1\end{aligned}\right.\end{equation}$，用 $x_{3}$、$x_{4}$ 表示 $x_{1}$、$x_{2}$ 得 $\begin{equation}\left\{\begin{aligned}&x_{1}=-2x_{3}+x_{4}+3\\&x_{2}=2x_{3}+0x_{4}-1\end{aligned}\right.\end{equation}$；有 $\forall k_{1},k_{2}$，使得 $x_{3}=k_{1}$、$x_{4}=k_{2}$，得出最终结果：$\begin{pmatrix}x_{1}\\x_{2}\\x_{3}\\x_{4}\end{pmatrix}=k_{1}\begin{pmatrix}-2\\2\\1\\0\end{pmatrix}+k_{2}\begin{pmatrix}1\\0\\0\\1\end{pmatrix}+\begin{pmatrix}3\\-1\\0\\0\end{pmatrix}$；其中，通解为 $k_{1}\begin{pmatrix}-2\\2\\1\\0\end{pmatrix}+k_{2}\begin{pmatrix}1\\0\\0\\1\end{pmatrix}$，该非齐次线性方程组的一个解为 $(3, -1, 0, 0)^{T}$；例题将行列式转换成上三角行列式再计算，$\begin{vmatrix}3&1&4&-2\\2&5&3&1\\1&2&2&-1\\-1&4&-3&5\end{vmatrix}=\underline{\hspace{3em}}$主对角线相同，其他元素是另一个相同的数；思路是将其他行都累加到第 $1$ 行，再提公因式使第 $1$ 行全为 $1$，$\begin{vmatrix}5&2&2&2\\2&5&2&2\\2&2&5&2\\2&2&2&5\end{vmatrix}=\underline{\hspace{3em}}$利用单位矩阵组成联合矩阵形式，再进行初等行变换；$A=\begin{pmatrix}1&2&-4\\2&3&-7\\-1&-1&2\end{pmatrix}$，求 $A^{-1}$利用等式两边同时左乘 $A^{-1}$ 来消 $A$；$A=\begin{pmatrix}1&2&-4\\2&3&-7\\-1&-1&2\end{pmatrix}$，$B=\begin{pmatrix}1&0\\0&-1\\1&2\end{pmatrix}$，若 $AX=B$，求矩阵 $X$合理运用相关矩阵公式，其中 $A^{*}=|A|A^{-1}$；$A$ 为 $3$ 阶矩阵，$|A|=\frac{1}{2}$，求 $|(2A)^{-1}-5A^{*}|$分块矩阵的计算；$\begin{vmatrix}1&2&0&0\\3&4&0&0\\0&0&5&6\\0&0&7&8\end{vmatrix}=\underline{\hspace{3em}}$；$\begin{pmatrix}0&1&0&0\\0&0&2&0\\0&0&0&3\\4&0&0&0\end{pmatrix}^{-1}=\underline{\hspace{3em}}$有 $\alpha_{1}=(1,2,3)^{T}$，$\alpha_{2}=(1,1,2)^{T}$，$\alpha_{3}=(0,2,2)^{T}$，$\alpha_{4}=(-1,-2,-3)^{T}$，$\beta=(2,5,7)^{T}$，求 $\beta$ 由 $\alpha_{1}$、$\alpha_{2}$、$\alpha_{3}$ 以及 $\alpha_{4}$ 线性表示的表达式求 $\alpha_{1}=(1,-1,-2,1)^{T}$，$\alpha_{2}=(1,1,0,-1)^{T}$，$\alpha_{3}=(2,-1,-3,0)^{T}$，$\alpha_{4}=(2,3,1,-2)^{T}$，$\alpha_{5}=(1,-2,-3,1)^{T}$ 的秩以及一个最大无关组，并将其余向量用该最大无关组线性表示求 $A=\begin{pmatrix}1&1&2&2&1\\-1&1&-1&3&-2\\-2&0&-3&1&-3\\1&-1&0&-2&1\end{pmatrix}$ 的秩以及一个最高阶非 $0$ 子式；注意是在原来 $A$ 中取最高阶非 $0$ 子式，且要保证 $|D_{r}|\neq0$方程组 $\begin{equation}\left\{\begin{aligned}&x_{1}+ax_{2}=0\\&x_{2}+ax_{3}=0\\&x_{3}+ax_{4}=0\\&x_{1}+x_{4}=0\end{aligned}\right.\end{equation}$ 有非 $0$ 解，求 $a$；将方程转为行列式 $|A|$，有非 $0$ 解，表示 $|A|=0$已知 $\alpha_{1}=(1,0,0,1)^{T}$，$\alpha_{2}=(a,1,0,0)^{T}$，$\alpha_{3}=(0,a,1,0)^{T}$，$\alpha_{4}=(0,0,a,1)^{T}$ 成线性相关，求 $a$；同第 10 题，不同问法$(1,3,0)^{T}$ 不能由 $(1,2,1)^{T}$、$(2,3,a)^{T}$、$(1,a+2,-2)^{T}$ 线性表示，求 $a$脚手架$\begin{vmatrix}1&2\\3&4\end{vmatrix}$$\begin{pmatrix}1&2\\3&4\end{pmatrix}$$=\underline{\hspace{3em}}$$\Leftrightarrow$
高等数学按照 301 标准的复习快速记忆泰勒展开与等价无穷小$\sin{x}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$，$\arcsin{x}=\underline{\hspace{3em}}$，$\tan{x}=\underline{\hspace{3em}}$，$\arctan{x}=\underline{\hspace{3em}}$，$\cos{x}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$$\frac{1}{1-x}=\underline{\hspace{3em}}$，$\frac{1}{1+x}=\underline{\hspace{3em}}$，$e^{x}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$，$\ln{(1+x)}=\underline{\hspace{3em}}=\underline{\hspace{3em}}$，$(1+x)^{\mu}=\underline{\hspace{3em}}$$f(x_{0})=\underline{\hspace{3em}}$常用积分$\int{k}dx=\underline{\hspace{3em}}$，$\int{x^{\mu}}dx=\underline{\hspace{3em}}$，$\int{\frac{1}{x}}dx=\underline{\hspace{3em}}$，$\int{a^{x}}dx=\underline{\hspace{3em}}$，$\int{e^{x}}dx=\underline{\hspace{3em}}$$\int{\frac{1}{1+x^{2}}}dx=\underline{\hspace{3em}}$，$\int{\frac{1}{\sqrt{1-x^{2}}}}dx=\underline{\hspace{3em}}$$\int{\sin{x}}dx=\underline{\hspace{3em}}$，$\int{\cos{x}}dx=\underline{\hspace{3em}}$，$\int{\sec^{2}{x}}dx=\underline{\hspace{3em}}$，$\int{\csc^{2}{x}}dx=\underline{\hspace{3em}}$$\int{\sec{x}}dx=\underline{\hspace{3em}}$，$\int{\csc{x}}dx=\underline{\hspace{3em}}$，$\int{\sec{x}\tan{x}}dx=\underline{\hspace{3em}}$，$\int{\csc{x}\cot{x}}dx=\underline{\hspace{3em}}$去根式转换（记得变限）：令 $\varphi^{2}(x)=\underline{\hspace{3em}}$，则 $\sqrt{\alpha^{2}-\varphi^{2}(x)}=\underline{\hspace{3em}}$令 $\varphi^{2}(x)=\underline{\hspace{3em}}$，则 $\sqrt{\alpha^{2}+\varphi^{2}(x)}=\underline{\hspace{3em}}$令 $\varphi^{2}(x)=\underline{\hspace{3em}}$，则 $\sqrt{\varphi^{2}(x)-\alpha^{2}}=\underline{\hspace{3em}}$例题
data structure选择题汇总广义表 head tailhead 取表头的 原子 or 表tail 取尾部的 表，且必须加 ()，tail 会把除了头以外所有组成一个表取完广义表的深度，长度树树转二叉树、逆过程；参考树转森林完全二叉树；参考前中后序遍历、层次遍历已知 前序 + 中序 或者 后序 + 中序，就可以唯一确认一颗二叉树层次遍历；从根节点开始，逐层遍历，从左往右遍历二叉排序树：概念，作用；使用中序遍历就能获取从小到大的数据排序线索二叉树，参考二叉树的算法表示树转森林的方法；从 root 开始，子树的右边拆掉，直接连接到当前根最优二叉树、哈夫曼树，参考给权 {5 6 7 8 15}；构造：每次都取最小的两个，合成最大的，不能计算合成的数，构造哈夫曼树时，先排序，全部放到最底端，然后连线，最后可以再优化着画，这样方便计算层数WPL：由各点的带权值之和，权值乘频率的累积前缀编码平衡二叉树；平衡二叉树左右深度差不高于 1；平衡二叉树一定是二叉排序树124 个叶子节点，问节点最多有多少；124 个叶子，表示有 124 - 2 个分支（有一个是 root 没有父节点），所以总共有 124 + 123 个节点，最后一个节点可以有 0/1 个节点，故最多 124 + 123 + 1 = 248 个有 n 个结点的二叉树采用二叉链表存储；空指针有 2n-(n-1)=n+1 个；其中的 n-1 是分支的个数，2n 是总共指针域的个数（每个结点左右两个指针域）；参考度为 4 的树 T，求 T 的叶子数；树的结点数 = 边数 + 1 = 4+4+3+4 + 1 = 16，叶子数 = 结点数 - 度不为 0 的结点数量 = 16 - 4-2-1-1 = 8；参考一颗完全二叉树第 6 层有 8 个叶结点，求完全二叉树结点最多个数；前 6 层满有 2^n-1=63，第七层有 2^(n-1)=64，缺少 2*8=16个，故最终有 63 + 64 - 16 = 111 个线性表二分查找；要求必须有序；画出折半查找过程的判定树计算 ASL 失败 和 ASL 成功线性表的岗哨模式；遍历算法BFS，广度优先，队列DFS，深度优先，栈图G<V,E>，顶点 V（vertex），边 E（edge），参考无向图、有向图带权不带权带权有向图：AOE 网，关键路径：路径长度最长的路径；由于在 AOE 网中有些活动可以并行地进行，所以完成工程的最短时间是从开始点到完成点的最长路径的长度（路径上各活动持续时间之和）找出关键路径和关键活动：列出活动表，e[i] 是最早开始时间，l[i] 最晚开始时间，e[i] == l[i] 即为关键活动；列出每个节点的最大权值，最早时间从前往后，最晚时间从后往前（如果上一个节点不是关键节点，得再往前找关键节点）拓扑序列：解决能否顺利完成任务邻接矩阵，带权邻接矩阵邻接表，有向图的邻接表；数组存储，链表结合存储（表头，链式）稀疏图、稠密图连通图：每个节点之间都必须能连通，因此至少有 n - 1 条边迪杰斯特拉（Dijkstra）算法，拓扑排序算法；可以用于判断一个有向图是否存在回路，如果存在拓扑排序，一定是无回图，否则至少包含一个环路最小生成树算法；参考用于在无向加权图中找到连接所有结点且权重和最小的子图；Kruskal 算法，遇到回路就放弃，但不能用于判断图是否有回路；Prim 算法，每次都找最小边散列表，哈希查找；散列函数必须解决两个问题：解决冲突和散列函数设计构造哈希函数的常用方法；参考除留余数法：关键字除以一个不大于哈希表长度的正整数 P，哈希的输出为其所得余数；P 值选择接近表长且不与组成关键字的字符基数直接相关的质数；数字分析法；取一组数据中共同有规律的部分作为哈希的输出；平方取中法；取关键字平方后的中间几位数作为散列地址开地址法、线性探测法；参考，增加：code % e.key，已有就往后占位查找：code % e.key，与所找不同就往后找，直到找到，或者碰到空的删除：code % e.key，与所找不同就往后找，找到以后删除，然后继续往后重新对所存在的序列进行 rehash 并置位扩容：将原来的数组遍历，取出数据后重新 hash 放到新的数组中，增加的法则与前文相同同义词指的是模后映射到相同地址的关键字（尽管可能往后占位解决冲突了）二次开地址法解决冲突，参考基本法则与开地址法相同，在碰到冲突时，不是直接往后占位，而是 29 % 11 = 7，冲突，则 (7 + 1) % 11 = 8链地址法、拉链法；在同一位置上维护一个链表存储每个落到当前位置的关键字处理冲突的查找成功和查找失败平均查找长度；拉链法查找成功时，分母为关键字个数；拉链法查找不成功时，分母为哈希表长度；线性探测法，参考；asl 成功，是各元素对应冲突次数的合集，除以元素个数；asl 失败，是散列表各位置往后碰到第一个为空的格子，所走过的格子数量和，分母是散列表长度装填因子，指关键字个数除以散列表的长度排序算法所需辅助空间，最坏情况下时间复杂度；快速排序；O(logn)，O(n^2)2-路归并排序；O(n)，O(nlogn)堆排序；O(1)，O(nlogn)起泡、气泡、冒泡希尔排序归并排序2-路归并排序，参考基数排序，参考选择排序堆排序；如果向堆中插入新数据；将新元素放在堆的末尾，然后进行上浮操作，将新元素与父结点比较并交换，直到满足堆的性质；堆通常是完全二叉树，插入会导致树的高度增加，高度增加对应着对数增长，其时间复杂度是O(log n)堆排序时，从下往上，从右往左开始调，并且选择非叶子结点；参考选择排序，参考插入排序；参考快速排序；参考链表的操作单链表双链表增删查改串连接串的概念队列循环队列循环队列的引入是为了解决假溢出时造成的大量移动数据增删查改一个队列 Q，计算其中元素个数；front 一般指向对头元素的前一个位置，rear 一般指向队尾元素，故元素个数：(Q.rear - Q.front + maxSize) % maxSize单向队列的增删查改双向队列的增删查改栈解决优化问题算法动态规划算法；有最优子结构，通常用于解决最长公共子序列、背包问题等贪心算法；每一步的最优选择可以推导出全局最优解，用于求解最短路径、最小生成树问题数组与对角矩阵，参考压缩矩阵；节省空间对称矩阵 $a_{12} = a_{21}$，有 i 行 j 列在逻辑上是矩阵的二维形式，在物理上是使用一维数组来存储的，因此在取第 $a_{ij}$ 个元素时，需要先求出前面 i - 1 行再加上当前行前面 j 个元素总共占用了一维数组多少个位置；其中第 i 行有 i 个元素计算法则：$$ \begin{align} & a_{ij} = \frac{(1 + (i - 1))(i - 1)}{2} + j - 1 = \frac{i(i - 1)}{2} + j - 1, &i \geq j \\ & a_{ji} = \frac{(1 + (j - 1))(j - 1)}{2} + i - 1 = \frac{j(j - 1)}{2} + i - 1, & i \lt j \end{align} $$$\frac{i(i-1)}{2}$ 是前 i - 1 行有的数量，$+ j$ 是当前行的 $a_{ij}$ 前面有的数量，$-1$ 是由于矩阵从 $(1, 1)$ 开始，而数组从 0 开始；得知 $a_{ij}$ 后，只需要对调 i 和 j 即可求出 $a_{ji}$下三角矩阵；只有下半有数，上半全为 0下三角矩阵转化成数组时，分为两部分，前面部分全部存储下三角中的数据，后部分只占 1 个数组位，整个数组看起来为 arr[n] = [1, 2, 3, ..., 0]，计算法则如下$$ \begin{align} & a_{ij} = \frac{(1 + (i - 1))(i - 1)}{2} + j - 1 = \frac{i(i - 1)}{2} + j - 1, &i \geq j \\ & a_{ij} = \frac{(n + 1)n}{2} + 1 - 1 = \frac{(n + 1)n}{2}, & i \lt j \end{align} $$表示要取上半部分的内容时（即 i < j 时），直接取数组最后一位的 0 即可上三角矩阵只有上半有数，下半全为 0可以参考下三角矩阵，计算公式如下：$$ \begin{align} a_{ij} &= \frac{[n + (n - (i - 2))](i - 1)}{2} + (j - i) + 1 - 1 \\ &= \frac{(2n + 2 - i)(i - 1)}{2} + (j - i), &i \leq j \\ a_{ij} &= \frac{(n + 1)n}{2} + 1 - 1 = \frac{(n + 1)n}{2}, &i \gt j \end{align} $$注意 i 和 j 的大小关系与下三角的区别就好三对角矩阵三条对角线引出来，只有对角线上有数，其他全为 0；因此三对角矩阵有 $3n - 2$ 个非零元素计算法则过于复杂，只给出式子；假设给出了数组中的第 k 位，要求其在三对角矩阵中的位置，也就是求 i 和 j，式子如下：$$ k = 2i + j - 3 $$根据 k 倒推出 i 和 j 流程：由 $i = [(k + 1) \bmod 3] + 1$ 推出 i 的位置，再由上式中的 $j = k + 3 - 2i$ 计算出 j稀疏矩阵写出稀疏矩阵的三元组线性表表达形式；给出三元组顺序存储表示；第一行元素分别代表：多少行，多少列，非零元素个数串串的模式匹配kpm 匹配算法，参考第 57 页，先写出完整串，大致思想如下next模式匹配：abaabcac-1abaabcac0a0a b1a b a1a b a a2a b a a b0a b a a b c1a b a a b c a0a b a a b c a c最终从 -1 开始各 next 值 +1，最后一行不要，得 next 值：01122312computer networking基础知识因特网的前身是 ARPANET网络的拓扑可以分为：星形网、总线网；总共有星形、环形、树形、总线性、网形计算机网络由 通信子网 和 资源子网 构成互联设备；物理层（中继器）；数据链路层（网桥/交换机）；网络层（路由器）；高层设备（网关）；死锁主要有重装死锁和直接死锁网络协议三要素：语义、语法、时态tcp/ip 参考模型（五层结构）：网络接口层（物理层、数据链路层合并）、网络层、传输层、应用层计算机网络等两大功能是连通和共享计算机网络的分类作用范围：广域网 WAN，城域网 MAN，局域网 LAN，个人 PAN；使用者：公用网，专用网介质：光纤、有线、无线协议 规定了对等层实体之间交互的数据、交互方式等规程流量整型是指调节进入网络的数据流的平均速率和缓冲区大小OSI 各层的主要功能：物理层：数据链路层：流量控制、差错控制、成帧传输层：差错控制、流量控制、顺序管理使用隧道技术进行网络互联的前提是原主机和目的主机所处的网络使用相同的网络层技术RFC 文档（Request for Comments，请求评论）是一系列记录关于互联网标准、协议和最佳实践的文件集合；互联网 协议 标准是按照 OSI 参考模型制定的，RFC 是记录这些协议标准的文件集合；所有互联网标准都是 RFC，但 RFC 不仅仅是互联网标准ISM，指工业、科学和医疗，是一些由 ITU 指定的在全球范围广泛使用的特定频段；综合业务数字网，ISDN；数字电话网络国际标准，是一种典型的电路交换网络系统；综合两字指使用一条线路就能传输语音、数据和图像等主要的网络标准化组织有：ISO、IEEE、IETF（因特网工程任务组）、ITU-T（国际电信联盟标准化部）下层为上层提供的服务是由一组系统调用或命令实现的，这些调用或命令被称为原语；数据交换的方式；电路交换，报文交换，分组交换电路交换（数据链路层）；通信双方建立一条物理链路，只能被单独占用，适合长时间、连续地传输数据报文交换（网络层）：发送的信息被组成报文，在网络中经过多次存储转发到目标结点，存在通信转发时延分组交换（网络层）：将数据分为多个小的固定长度的数据报；接收方需要对接收到的各个分组重新排序；使用 ATM （异步传输模式）网络；ATM 是以信元为基础的一种分组交换和复用技术，支持许多种类型如声音、数据、传真、实时视频、CD质量音频和图像的通信，面向连接ATM单元，长度 53 字节（5 字节头，48 有效载荷），ATM 单元就是信元虚电路，X.25，采用 X.21 接口标准；953 里是虚呼叫（交换虚电路，不需要建立固定连接），永久虚电路（固定虚电路，连接前需要建立固定路径）数据通信的分类：按照数据传输的方向分类；按照同步的方式分类数据传输的方向单工，信道只能单向，例如广播；半双工，信道可以双向，但是一次只能一边进行单向传输，例如对讲机；全双工，信道允许同时在两个方向上进行通信，信道被分为两个部分，一个发送数据，一个接收数据；例如打电话同步的方式同步传输，双方时钟频率要一致，发送方发送连续的比特流；异步传输，发送方发送完一个字节后，可以经过任意长的时间间隔再发送下一个字节OSI 七层参考模型物理层电气特性（0、1 哪个是电压）、机械特性（双绞线、接口之类的）、过程特性、功能特性双绞线易受电磁干扰，耐久性低以太网的物理层标准 100BaseT，表示 数据速率 100Mb/s、基带信号、双绞线编码：电压（模拟信号）转 0101；调制：0101（数字信号）转电压ADSL，非对称数字用户线路；用电话线的较低频率来接入互联网，需要调制解调器（Modem）来实现数字信号和模拟信号之间的转换，适配于 ADSL 的调制解调器是被称之为 DSL 调制解调器物理层信道复用（Division Multiplexing）的方式有：频分复用（Frequency DM，FDM）、时分复用（Time DM，TDM）、码分复用（Code DM，CDM）典型的有线传输介质是：光纤、双绞线、同轴电缆、电力线信号在传输，可能出现的传输损伤为：衰减、噪声在电话网中，一路话音经过 PCM 编码后的传输速率为 64kbpsV.28 电气特性（负逻辑）；-3～-15 是 1，+3～+15 是 0数据链路层以太网、数据链路层中的基本单位是帧ARP，地址解析协议；ARP，，主要作用是将 IP 地址转换为 MAC 地址，arp 请求是广播，响应是单播；跨子网传输时，以太网帧头的目的地址是路由器端口的 MAC 地址用于将 ip 地址映射为 mac 地址；成帧成帧的方式主要有：零比特填充（5 个 1 后加 0），字节填充（添加转义字符 0x7D，一般用于帧界定）PPP 协议，Point-to-Point Protocol，是一种用于在两个结点之间进行数据传输的数据链路层协议，PPP 不具备 MAC 功能介质访问控制，MAC；局域网中最重要的技术：介质访问控制技术衡量介质访问控制子层中，多路访问协议性能的主要指标有：迟延、吞吐量ALOHA：用户有帧就发，采用冲突监听和随机重发机制；容易重叠破坏载波监听多路访问，CSMA；站点要发数据前，先监听总线上有无正在发送数据的计算机，如果有则等待，随后找时间再发；以太网监听方式、或者问常用的载波侦听多路访问协议（CSMA）如下非坚持型 CSMA，随机时延后退，减少冲突，但是增大发送时延1-坚持型 CSMA，持续监听信道，遇到空闲就发送，有利于抢占信道，减少信道空闲时间，但是增大冲突概率p-坚持型 CSMA，在信道空闲时以概率 P 发送，以概率 1-P 延时，关键在于 P 的选择载波监听多路访问/冲突检测（CSMA/CD）；主要是用于总线式以太网，检测电压变化，当数据发生碰撞，电压就会跟着发生变化；总结为：先听再说、边说边听、冲突检测、冲突停止；该协议的三个通信状态是：空闲、冲突、传输半双工工作模式下，采用 CSMA/CD 多址接入时，可以利用 Hub 和 switch 进行组网CSMA/CA；也是载波监听，这是 WLAN 的；主要应付隐藏终端和暴露终端的问题MACA，用于解决 WLAN 中的多址接入和避免冲突；主要原理是采用请求发送（RTS，Request to Send）和清除发送（CTS，Clear to Send）的机制，要发数据前，先发一个 RTS 给目标，目标如果可以接收消息，就广播 CTS 给其他所有节点，通知他们这段时间被占用，有效解决因为隐藏终端产生的碰撞多路复用技术：即多个用户共享线路资源频分复用，按频率划分不同信道时分复用，按时间划分，用户在不同时间使用相同的频率传输波分复用，在波长划分码分复用（码分多址 CDMA），为用户分配独特的码片序列，每个站点的码片序列各不相同且正交交换机转发分组的依据是目的 MAC 地址交换机上的端口没有 MAC 和 IP，工作在数据链路层不具备寻址和路由能力；数据链路层成帧的方法字符计数法：用特定字符来指示数据帧中数据字段的长度字符填充法：数据帧以特定的开始和结束字符标记，如果数据中包含这些标记，需要添加转义字符比特填充法：11111 后添加 0物理层编码违例法：每个数据帧都以特定的帧头尾标识；在传输层，无连接指类似 udp 协议，面向连接指 tcp 协议位图协议是 mac 协议的一种，通常用于卫星通信等网络，是一种无冲突协议；其他无冲突协议还有：令牌传递、二进制倒计数法IEEE 802 标准将数据链路层划分为：逻辑链路控制 LLC 子层、媒体接入控制 MAC 子层IEEE 802.5 局域网环令牌IEEE 802.3 以太网标准，规定数据帧格式，传输速率，物理介质等IEEE 802.11，无线局域网标准数字载波标准（数字电话和数据通信系统），T1 的速率是 1.544 Mbps （采取时分多路复用技术有 24 个信道，每个信道的速率是 64 kbps）；E1 的速率是 2.048 Mbps，中国采用的是 E1 标准；HDLC（高级数据链路控制），一种面向 bit 的通信控制流程，可以实现错误检测，也就是规定了使用曼彻斯特编码等；网络层路由器使用路由器互联多个局域网时，这些局域网的数据链路层协议和物理层协议都可以不同路由器转发分组的依据是 IP 地址路由器工作在网络层，具备路由能力，各端口有 MAC 和 IP路由器可以隔离 MAC 层广播帧分组转发时，如果出现两个都可以达到的网络地址，则优先选择 cidr 更长的在大型网络中，为了防止路由表过大，减小路由开销，通常采用分层路由策略路由协议（算法）链路状态路由算法（LR）中每个节点都需要向全部节点发送链路状态信息；OSPF 是一种基于链路状态的路由协议距离矢量路由算法；RIP 协议是分布式域内路由协议，采用距离矢量算法，这种算法不能获取网络拓扑结构（只知道下一个要去的路由器是哪个）在网络层，无连接说的是"每个数据包独立传输"，面向连接说的是"使用虚电路进行通信"ipv4TTL 字段的作用是规定路由的跳数ipv4 分组的分段可以在任何一个途径的路由器进行，但是 ip 分段的重组只能在最终的目的主机进行ipv6 有 128 位，ipv4 是 32 位ip在整个因特网传输过程中，ip 数据报首部中的源地址和目标地址都不会改变ip 地址中，网络号的作用是指定主机所属的网络在 internet 上传输的 ICMP 报文封装于 ip 报文中ip 协议提供不可靠无连接的网络传输服务Internet 通过 ip 地址和端口号来标识传输地址ip 地址采用分层编址方式，常见的分层编址还有身份证，邮编等ip 划分；ip 中，全 0 的地址一般称为整个网络，全 1 的地址为广播地址；另外，在 TCP/IP 中，主机号 全 0 称为本地地址，全 1 称为广播；进行主机地址选择时，主机位全为 1 时是广播地址，全为 0 是网络地址；假如 cidr 为 22 时， x.x.01 / 110000.FF 可以作为主机地址，但是 x.x.01 / 000000.00 则不可以，因为其后面全是 0 ，这是子网的网络地址；ip 报文中，端口长度为 2 字节，主要作用是标识应用程序或通信进程；在 TCP/UDP 传输段中，源端口地址与目的端口地址不能相同传输层滑动窗口协议有：后退式 n-ARQ、停等式 ARQ、选择重发式 ARQARQ 技术，即自动请求重发技术；利用差错检测技术自动地对丢失的帧和错误帧请求重发回退 N 帧：发送窗口大于等于 1，接受窗口为 1，不用缓存，发送方可以连续发送多个分组，当收到窗口第一个分组的 ACK 后，窗口向后滑动一位；如果迟迟没有收到某一分组的 ACK，则超时后重发该分组以及之后所有分组；发送窗口最大为 $2^{n}-1$；停等式：发送和接收窗口都为 1，发送数据后等待接收方回复，若收到回复则继续发送下一个分组，若没有则超时重传；选择重发式：接收方发现某个帧出错，将之后的帧都放到接收缓冲区，要求发送方重传出错的帧（发送一个重传请求 NAK），接收方重传该帧。等到所有帧都按顺序到位后，再在缓冲区中组合并交付给上层；发送窗口和接收窗口最大都为 $2^{n-1}$传输层提供了两种类型的服务：面向连接的服务（TCP）和无连接的服务（UDP）tcp进行面向连接的数据传输，要经历：建立连接、传输数据、释放连接三个过程，意味着可靠，顺序tcp 在确认信息中会捎带下一个希望接收的字节（也就是 ack）tcp 发送方的窗口大小取决于：接收方允许窗口、拥塞窗口udp无连接的服务，每个分组独立地到达目的地，不保证可靠的顺序提交；udp 协议的特性是：提供无连接服务、端到端服务、全双工服务会话层表示层应用层电子邮件；smtp 是专门发送邮件的通讯协议，走互联网，端口号 25；pop3 是专门接收，端口号 110；一些表格中英文简称对照表：英文简称中文名英文简称中文名ADSL非对称数字用户线路NAT网络地址转换协议ARQ自动重传请求OSI开放式通信系统互联参考模型ATM异步传输模式OSPF开放式最短路径优先B2C商对客PAN个人区域网，个域网BGP边界网关协议PSTN公共电话交换网CIDR无类别域间路由QoS服务质量CSMA/CA载波侦听多址接入/尽量避免冲突REID资源管理实体标识CSMA/CD载波侦听多址接入/冲突检测RIP路由信息协议DHCP动态主机设置协议RTP实时传输协议DMT离散多音RTCP实时传输控制协议ICMP互联网控制报文协议SONET同步光网络IEEE美国电气和电子工程师协会TCP传输控制协议IGMP因特网组管理协议TSAP传输服务访问点ITU国际电信联盟UTP无屏蔽双绞线MAC介质访问控制UDP用户数据报协议MACA多址访问冲突避免协议 ip 几类网划分，共有 A，B，C，D，E 五类地址，参考名称范围描述A 类1.0.0.0 - 126.0.0.00000 0000.0.0.0，前 8 位是网络地址，后面全是主机地址B 类128.0.0.0 - 191.255.0.01000 0000.0.0.0，前 16 位是网络地址C 类192.0.0.0 - 223.255.255.01100 0000.0.0.0，前 24 位D 类224.0.0.0 - 239.255.255.2551110 0000.0.0.0，用于多播E 类224.0.0.0 - 255.255.255.2551111 0000.0.0.0，保留地址一个 TCP/IP 标准模型参考模型层相关概念 TCP相关概念 UDP应用层TELNET、FTP、SMTP、HTTPDNS、TFTP、SNMP、DHCP运输层采用 TCP采用 UDP网际层（该层）ICMP、IGMP、IP、RARP、ARP 网络层（网络接口层） 计算题CRC 冗余码计算求生成多项式由生成多项式倒推是否传输出错生成多项式：G(x) = x6 + x5 + x + 1，多项式有 7 位，则其余数应该取 6 位，则 n = 6，1100 011信息位：1101 1100 1000 1，计算补 6 个 0， 1101 1100 1000 1 000000冗余码：长度与 n = 6 一致，0 10110最终结果：1101 1100 1000 1 010110验算：最终结果 / 生成多项式 = 0，则无差错；在验证题目时，看清楚题目要求的是数据中某位出现错误，也即上面的 1101 1100 1000 1，不包括最终结果中最后的 6 位 crc数据报的分片给出 TCP 数据报长度，给出 MTU，问分片标识符（基本不变）、对应片偏移（当前片对应数据报起始位置 / 8，原因是 ipv4 中的偏移单位为 1 字 = 8 Bytes）、DF、MF、几个分片？注意数据报长度 ≠ 分片长度，需要 + 20 Bytes给出 UDP 数据报长度，UDP 不能在运输层分片（TCP 可以）。当 udp 报文要使用以太网来传输时，必须加上 tcp 的 20 Bytes 的头，因此包含有 udp 的报文总长为 1480 = 1472 数据 + 8 udp 头一个 UDP 用户数据报的数据字段有 6192 Bytes，在链路层使用以太网来传输，问应当划分几个 IP 数据报片，要求说明每一个数据报字段长度以及片偏移字段的值。该 UDP 用户数据报总长度需要加上 8B，故要传输的总长度为 6192 + 8 = 6200 B；使用以太网来传输，需要添加 ip 报头，在 MTU 为 1500 的情况下，每使用一个 ip 数据报运载 udp 报文时，其长度为 1500 = 20 B 的 ip 报头 + 1480 B 数据段；故总共有 6200 / 1480 = 4 完整片 + 1 剩余片，故总共需要分 5 片，得到片偏移字段分别为 0、185、370、555、740注意题目要求的是 IP 数据报片（需要加上标准数据报头），还是纯数据报片（不用考虑 ip 数据报标准头）TCP，UDP 报文的标准结构：TCP 20 Bytes，UDP 8 Bytes，参考 1，tcp，参考 2，udpDF：Dont fragmentMF：More fragmentMTU：Maximum Transmission Unit，最大传输单元，常见的是 1500，其中包括对应的 tcp 或者 udp 头占用，则数据段分别为 1480 Bytes 和 1492 Bytes 的大小1 Byte = 8 bit码分多址通信多个站使用同一个信道发送序列，收到了（-1 +1 -3 +1 -1 -3 +1 +1）的序列，四个站的码片序列其中的有 （-1 -1 -1 +1 +1 -1 +1 +1），使用接收到的序列和码片序列进行正交运算如下$$ \begin{align} & (-1 +1 -3 +1 -1 -3 +1 +1) \times (-1 -1 -1 +1 +1 -1 +1 +1) \\ & = \frac{(1 - 1 + 3 + 1 - 1 + 3 + 1 + 1)}{8} \\ & = 1 \end{align} $$结果若为 0，则该站点无发送；若为 1，表示该站点发的 1；若为 -1，表示发的 0地址聚合地址聚合是指将一组相邻的IP地址块合并为一个更大的IP地址块的过程。超网（Supernet）是一种网络设计概念，旨在通过合并多个较小的IP地址块，创建一个更大的、更紧凑的地址块。这种合并的过程有助于简化路由表，减少路由表的大小，提高网络的效率。超网主要通过地址聚合实现。有以下四个地址：212.56.132.0/24，212.56.133.0/24，212.56.134.0/24，212.56.135.0/24；要求进行最大可能的聚合；做法：找不同的位，匹配最大前缀；例如以上四个地址转化成二进制位得212.56.1000 0100.0/24，212.56.1000 0101.0/24，212.56.1000 0110.0/24，212.56.1000 0111.0/24则共同最大前缀为 8 + 8 + 6 = 22 位，所以聚合得到的 CIDR 地址为 212.56.1000 0100.0/22，即212.56.132.0/22路由表的更新采用 RIP 协议交换路由信息，有如图所示表达G1 当前路由表信息：目的，距离，下一跳G2 发来路由表更新信息：目的，距离最终 G1 路由表信息：目的，距离，下一跳10.0.0.0；1；direct10.0.0.0；410.0.0.0；1；direct20.0.0.0；5；G925.0.0.0；320.0.0.0；5；G925.0.0.0；4；G230.0.0.0；425.0.0.0；4；G230.0.0.0；6；G840.0.0.0；330.0.0.0；5；G240.0.0.0；3；G260.0.0.0；240.0.0.0；3；G255.0.0.0；4；G580.0.0.0；355.0.0.0；4；G580.0.0.0；4；G590.0.0.0；480.0.0.0；4；G5 90.0.0.0；5；G2在计算前，需要将 G2 发来的路由表 +1编码海明码，参考，传送 11010011，需要多少冗余位？；m + k + 1 < 2^k，其中 m 为信息位的长度 8，算得 k 为 4；将 2^0，2^1，2^3 和 2^4 几个位置提出来，剩下的位置填入要发送的内容；然后根据奇偶校验的原则，提取位置上的值曼彻斯特编码（数据链路层 HDLC 使用的编码），差分曼彻斯特编码曼彻斯特编码（有两种约定，IEEE 802.3 用的是第二种约定，下以后者为准），低到高是 1，高到低是 0；即前 T/2 画相反，后 T/2 画本身差分曼彻斯特编码，和前一个图形，0 先相反再相反（有跳变），1 先复制后相反（无跳变）；归零码，不归零码奈奎斯特定理、香农定理参考奈奎斯特定理，求无干扰低通信道的最大传输速率（也叫数据率）；$速率 = B\log_{2}V = 2W\log_{2}V$，其中 $B = 2W$ 是码元传输速率（波特率），$W$ 是信道带宽，$V$ 是单个信号的离散状态数；香农定理，有干扰情况下信道的最大传输速率；$速率 = W\log_{2}(1+\frac{S}{N})$，其中信噪比 $\frac{S}{N}$ 可由 $dB = 10*log_{10}\frac{S}{N}$ 来求;如果同时计算奈奎斯特定理和香农定理，由于都是理论极限，两者取最小值例题：带宽 4KHz 的无噪信道，1 个码元带 3bit 信息，问最大传输数率，若信噪比为 20db，问此时最大又是多少；奈奎斯特定理：$R_{max} = 2 * 4Khz * log_{2}3 = 8 * 1.58 = 12.64mbps$；香农定理：$20dB=10*\lg{\frac{S}{N}}$，得 $\frac{S}{N}=100$，因此 $R_{max}=4KHz*\log_{2}{(1 + \frac{S}{N})} = 26.6mbps$波特率 1000Baud，若令其有效传输速率为 4kb/s，问单个信号码元有效离散值个数；16CSMA/CD信道传播速度，指从源头到目标走一趟，符号为 $\tau$，信道长度除以信号传输速率；争用期指的是来回一趟，就是 $2\tau$最短帧长 = 发送速率 * 争用期TCP 滑动窗口机制又称信用量机制，信贷滑窗协议简答题从网络规模的角度，网络大致可以分为几类，这几类网络各自有什么特点？按照规模来分，可以分为：个域网：设备围绕着一个人通信，典型为蓝牙局域网：私有网络，传输范围有限，广泛用于连接个人计算机和其他终端，典型是 WIFI城域网：可以覆盖一座城市，典例为有线电视广域网：跨越很大的地理区域，国家地区大陆等，例如 vpn互联网：一组相互之间不同且不兼容的网络连接起来组成的网络，典例为 Internet分别论述电路交换和分组交换电路交换：通信双方在通信前要建立起一条独占的物理通路分组交换：采用存储转发的方式，将一个长报文分割为较短的分组，然后逐个地发送到目标终端简要介绍 tcp 通信（或者面向连接的通信）过程，假设 A 是 client，B 是 server第一次握手：A 向 B 发送连接请求报文 [SYN=1，seq=x]；第二次握手：B 向 A 发送确认报文 [SYN=1，ACK=1，seq=y，ack=x+1]，此处 B 自己选择一个序号 y，并且将 ack 置为 A 第一次握手时的发来的序列加一，ack 是期望接受的下一个传输段载荷的首字节序号；第三次握手：A 向 B 发送确认报文 [ACK=1，seq=x+1，ack=y+1]，同样的，ack 也要置成第二次握手时发来的序列加一；此时双方都进入 ESTABLISHED 状态，说明连接已经建立完成，可以发送数据了简述 OSI 参考模型下各层功能物理层：利用传输介质为数据链路层提供物理链接，实现比特流的透明传输；数据链路层：通过各种控制协议，将有差错的物理信道转变为无差错的、可靠传输的数据链路；主要行为是成帧（帧定界）、差错控制、流量控制；网络层：通过路由算法，为报文或分组选择合适的路径，主要是用于控制传输层和链路层之间的路由关系；传输层：为用户提供可靠的端到端差错和流量控制，保证报文正确传输，向高层屏蔽下层数据细节，向用户透明地传输报文；会话层：向两个实体的表示层提供建立和使用连接的方式，协调两个回话进程之间的通信；表示层：对来自应用层的数据和命令进行解释，按照一定格式传给会话层；应用层：直接向用户提供服务，完成用户的各类要求简述透明网桥的工作原理（网桥的逆向地址自学习法）每个网桥保存一个动态转发表，包含目的站点 mac 和 端口号；采用逆向自学习法：初始时，转发表为空，当一个 MAC 帧到达网桥，网桥根据其源 MAC 以及来源端口添加或刷新一条记录；转发表的每一项都设置一个超时计时器，如果超时了就会删除；某一帧到达网桥时，查询转发表：如果找到记录，则向对应端口转发；如果没有则向除了到来的端口外所有端口广播；透明网桥在处理 MAC 帧时，如何处理？如果目的端口和源端口相同，丢弃该帧；如果目的端口与源端口不同，则转发到目的端口；如果目的端口未知，采用泛洪法，向所有除了来向外的端口转发该帧；简要说明无线局域网中隐藏站、暴露站的问题，给出解决方案；p 239隐藏站点问题；假设有终端 A、B 分别在 Server 左右两边（无线信号覆盖不到另一边），A 到 Server 在通信时，B 在另一方向并不知道 Server 目前正在被占用，就会导致数据无法被接收等问题；解决方法是 MACA 协议；暴露终端问题；A、B、C、D 一字排开，B 的信号可以覆盖 A、C，而 C 的信号可以覆盖 B、D，此时 B 在给 A 发信息，而 C 想要给 D 发信息，却因为 B 在发信息导致以为信道忙，对于 C 来说，B 就是暴露终端；简述流量控制和差错控制机制，在数据链路层和传输层上的相同点与不同点对于数据链路层和传输层；流量控制，前者主要考虑接收方的接收能力；后者由于往返迟延变化大，主要考虑拥塞问题；差错控制，前者主要针对误码；后者主要针对分组的排序；给出数据链路层帧定界的方法并简要说明比特填充；发送方连续 5 个 1 后插入一个 0，接收方连续 5 个 1 后删除一个 0，以 FLAG 定界；字符填充：FLAG 字符、ESC 字符，发送方在数据 FLAG 和数据 ESC 前插入 ESC，接收方删除 ESC FLAG 和 ESC ESC 的第一个 ESC，以单个 FLAG 定界；简述距离矢量路由算法的基本原理确定相邻节点距离，建立初始路由表；与相邻节点交换路由表；根据收集到的路由表和相邻节点距离，优化和计算新的路由表；反复交换反复优化，动态掌握路由信息；简述 UDP 和 TCP 之间的区别UDP 是一个简单面向数据报的传输层协议，不提供可靠性，只发但不保证到达目的地，没有超时重传等机制，故而传输速度很快；TCP 提供面向连接、可靠的字节流服务，通信前必须建立一个 TCP 连接，之后才能传输数据，TCP 提供超时重传、丢弃重复数据、校验、流量控制等功能，保证数据能够安全送达；Cryptography(a, b) = 1 表示最大公因数是 1，[a, b] = c 表示最小公倍数是 c；若 a=bc，则表示为 b|a，称 b 能整除 a计算题求 a，b 的最大公约数；使用辗转相除法求出最大公约数 r，再使用拓展欧几里得算法求出 a = bx + r 的形式，所得即为乘法逆元
course | privacy-preserving-models-and-algorithms
Privacy-Preserving Models and Algorithms隐私保护模型与算法，课程学习内容及思考midterm examessay quiz论述大数据生命周期每个阶段面临的安全威胁和采取的安全技术大数据生命周期通常有以下几个阶段：p7单同态、部分同态以及全同态的含义；并以 RSA 算法为例给出同态算法及其所具备的同态性，验证之单同态 指部分同态 指全同态 指design quiz设计一个基于多服务器的隐私信息检索 PIR 方案：数据 $X = (x_{1}, x_{2}, ..., x_{16})$待查数据为 $x_{10}$总共有 4 个服务器给出详细步骤并分析其安全性假设 $\sigma\oplus i$ 表示将 $\sigma$ 的第 $i$ 位取反；例如 $\sigma = 111$，则 $\sigma \oplus 2 = 110$将数据 $X = (x_{1}, x_{2}, ..., x_{16})$ 转换成矩阵表示的方式如下： $$ \left[ \begin{array}{1} x_{1} & x_{2} & x_{3} & x_{4} \\ x_{5} & x_{6} & x_{7} & x_{8} \\ x_{9} & x_{10} & x_{11} & x_{12} \\ x_{13} & x_{14} & x_{15} & x_{16} \end{array} \right] $$ 将其转换为矩阵位置的表示方式如下： $$ \left[ \begin{array}{1} x_{00} & x_{01} & x_{02} & x_{03} \\ x_{10} & x_{11} & x_{12} & x_{13} \\ x_{20} & x_{21} & x_{22} & x_{23} \\ x_{30} & x_{31} & x_{32} & x_{33} \end{array} \right] $$ 则待查数据 $x_{10}$ 在位置矩阵中表示为 $x_{21}$ 由服务器个数为 4，数据总数量为 16，则生成 $\sqrt{4} = 2$ 个，每个位长为 $\sqrt{16} = 4$ 随机参数： $$ \begin{align} \sigma_{0} &= 0001 \\ \tau_{0} &= 1000 \\ \sigma_{1} &= \sigma_{0} \oplus 2 = 0011 \\ \tau_{1} &= \tau_{0} \oplus 1 = 1100 \end{align} $$ 其中的 2 和 1，是由 $x_{21}$ 对应位置得到的，则转成随机数矩阵为： $$ \left[ \begin{array}{1} \sigma_{0} = 0001 & \tau_{0} = 1000 \\ \sigma_{1} = 0011 & \tau_{1} = 1100 \end{array} \right]\left[ \begin{array}{1} \sigma_{0} = 0001 & \tau_{0} = 1000 \\ \sigma_{1} = 0011 & \tau_{1} = 1100 \end{array} \right] $$ 由 4 个服务器，同样也用位置矩阵来表示可得： $$ \left[ \begin{array}{1} DB_{00} = \sigma_{0} \times \tau_{0} & DB_{01} = \sigma_{0} \times \tau_{1} \\ DB_{10} = \sigma_{1} \times \tau_{0} & DB_{11} = \sigma_{1} \times \tau_{1} \end{array} \right] $$ 则计算结果如下： $$ \begin{align} DB_{00} &= \{x_{30}\} \\ DB_{01} &= \{x_{30}, x_{31}\} \\ DB_{10} &= \{x_{20}, x_{30}\} \\ DB_{11} &= \{x_{20}, x_{21}, x_{30}, x_{31}\} \end{align} $$ 将所有计算结果进行异或（下面的公式中 $\oplus$ 是异或，不再是上边自定义的取反符号）： $$ x_{30} \oplus x_{30} \oplus x_{31} \oplus x_{20} \oplus x_{30} \oplus x_{20} \oplus x_{21} \oplus x_{30} \oplus x_{31} = x_{21} $$ 由上面的式子可以看出，经过将返回结果异或后，只剩下了 $x_{21}$，这与一开始要查询的标号相等，也就表示最后从这么多服务器返回的这么多结果中取得了想要的值，至此，基于多服务器的 PIR 方案结束 接下来验证该方案的 正确性 以及 安全性：正确性用一种比较直观的方式来表示为什么能够得出想要的值关注于第 2 步中，第二个 $\sigma$ 和 $\tau$ 矩阵可以得知，当 $\sigma_{i}$ 与 $\tau_{j}$ 分别组合时（其中 $i, j \in \{0, 1\}$），$\sigma_{i}$ 中的第 3 个 bit 值为 1，以及 $\tau_{j}$ 的第 0 个 bit 值为 1，组合出的 $x_{i, j}$ 都是成对出现的；只有因为选定的 $x_{21}$ 而导致的 $\sigma_{i}$ 的第 2 bit 和 $\tau_{j}$ 的第 1 bit，在整个过程中只出现一次；在最后的全部结果异或过程中，由于异或操作的特性，偶数个出现的会被消除，奇数个的会保留，也就因此返回了正确的值安全性根据正确性可以得知，在 4 个服务器所存储的数据相同，且互相之间不能通信的情况下，服务器只根据生成的随机数来返回所需的数据，本地所选择的 $x_{i}$ 对于服务器来说是未知的。服务器总共返回了 9 个数据，而检索者最后只需要取得其中一个，其他数据是不被需要的，但是服务器无法确定检索者具体想要哪个数据，也就达到了隐私保护的目的。设计一个基于 对称算法 的比特承诺方案，给出详细步骤并分析其安全性假设一个场景，A 与 B 进行猜数游戏，A 所猜的值是 B 所想的值（预测与揭示模型），要求如下：A 先猜数，且不能反悔B 随后得出自己所想的值B 在 A 主动揭示自己猜的内容之前，无法得知 A 所猜的值整个流程必须保证 A 和 B 之间不能互相受到干扰具体设计流程如下：承诺阶段：B 生成一个比特序列 $r$，将其发给 A；过程表示为：$B \to A: r$A 确定所猜想的数 $x$，并且生成另一个随机数 $k$ 作为对称密钥，并且用 $k$ 计算加密 $s = E(k, r \mathbin\Vert x)$这里的 $ r \mathbin\Vert x$ 表示将 $r$ 与 $x$ 链接起来，例如：当假设 $x = 63 = 00111111$，比特序列 $r = 1111$，则 $ r \mathbin\Vert x = 111100111111$；然后将 S 发给 B；$ A \to B: s$B 确定自己所想的值为 $y$揭示阶段：A 将对称密钥 $k$ 发送给 B；$A \to B: k$B 使用所得的对称密钥计算 $r^{'} \mathbin\Vert x = D(s, k)$，得出结果后，验证 $ r^{'} = r$，则往后的值就是 A 所承诺的 $x$随后 B 就可以对比 $x$ 和 $y$，并证明猜测的正确性算法的 安全性：homework请简述大数据如何服务于信息安全。请简述自主访问控制模型和强制访问控制模型的基本思想及两者的区别和联系。请简述 BLP 模型与 Biba 模型的基本思想及两者的区别和联系。请简述基于单发送者广播加密的访问控制方案，给出方案具体流程并分析其安全性。请简述基于公钥广播加密的访问控制方案，给出方案具体流程并分析其安全性。请简述典型的对称密文检索方案，给出方案具体流程并分析其安全性。请简述基于 文档-关键词索引 的密文关键词检索方案，给出方案具体流程并分析其安全性。请给出属性加密访问控制技术的基本思想，并简述 CP-ABE 算法。构造基于单向函数的比特承诺方案，给出方案具体流程并分析其安全性。给出基于交互式 Schnorr 协议的零知识证明系统，使得 A 让 B 相信其拥有私钥 s。假设 A 的财富值为 a=0，B 的财富值为 b=1，设计基于混淆电路的安全协议比较 A 和 B 的财富值，给出协议具体流程并分析其安全性。
reviewsnotechapter 01homeworkchapter 01畫出 IP 協議的組成，解釋字段含義，分析如何使用字段進行攻擊闡述 TCP 三次握手過程，分析 TCP 協議哪些字段可以用於攻擊數據報相關字段分析數據報總長度為 3820 Bytedata 段長度為 3800 byte要分片為長度不超過 1420 byte 的數據報片給出分片后每個數據報片相關字段的值（MF，DF，片偏移）APT 是什麽，記錄一些相關例子，包括攻擊目標、手法、案例等chapter 02病毒、蠕蟲、僵尸網絡、木馬等相關概念的解析定義特徵各性能對比震網病毒、火焰蠕蟲瞭解遠控木馬相關遠控木馬幾種連接方式駭客利用遠控木馬進行網絡入侵的步驟icmp 協議的哪些特性可以被木馬利用？Ficker 攻擊原理windows 下，如何進行動態提權；tips：LookupPrivilegeValue，OpenProcessTokenchapter 03信息搜集常用的方法；在僅知道站點域名的情況下whois 等查明站點的 ip 地址管理員信息，站點内部主機資料shodan、fofa 等語法搜索日本東京 2017 年 1 月 1 日后新出現的 linux 系統主機談談 shodan 的探測規律和策略搜索引擎檢索語句filetype: xls, 成績單chapter 04Wanna Cry 蠕蟲的傳播、加密以及解密流程一次完整的網絡安全漏洞掃描應該進行的行爲；主機發現、OS 識別、端口掃描、漏洞掃描以上幾個階段分別采用什麽技術漏洞掃描工具的組成原理以及主要功能chapter 05TCP SYN 洪流攻擊攻擊原理，要求能夠分析半連接表的變化情況爲什麽在實際使用時，攻擊者需要僞造源地址SYN 洪流攻擊計算題半連接隊列長度為 1024，重試次數為 5 次重試間隔每隔 1s 翻倍需要構造多少 SYN 請求包，才足以占滿半連接隊列？反射式 DDoS 攻擊原理、優勢設計一個 SSDP 協議中實現 100G 攻擊流量的反射式 DDoS 攻擊方案攻擊源數量每秒請求報文次數反射服務器的數量流量清洗技術的主要原理靜態口令靜態口令面臨的安全風險一個安全的口令有哪些原則以及策略Windows 口令攻擊的原理與過程弱口令分析身份證、生日、手機號碼等作爲口令的安全性；即通過窮舉能夠猜測得到口令的可能性動態口令給出一個例子，解釋原理列舉使用場景以及安全性代碼實現口令强度檢測方案計算大小寫，數字，密碼模式chapter 06交換機畫圖描述交換機 CAM 表的自學習過程對交換機使用 MAC 洪範攻擊，爲什麽會使得交換機變成集綫器，像所有端口轉發數據？針對 MAC 洪範攻擊的防禦措施ARP 欺騙，中間人攻擊詳細描述駭客利用 ARP 欺騙來實現網絡監聽的步驟DNS ID 欺騙的原理，防禦方法chapter 07緩衝區溢出攻擊的基本原理sql 注入邏輯 sql 繞過，詳細描述方式注釋型繞過如何使用預編譯的方式來防止 sql 注入；解釋預編譯的原理chapter 08L2TP 協議原理，應用其中節點的主要作用幾種不同應用場景原理IPSec 隧道原理，組成DH 密鑰交換協議原理中間人攻擊如何應用在 DH 算法當中；改進方法SSL 通信原理，實現流程SSL 劫持攻擊原理SSL 剝離攻擊原理quizchapter 01TCP/IP 的脆弱性解釋 APT 攻擊；説出特點、防禦方法病毒、木馬、蠕蟲分別是什麽；寫出區別chapter 02shodan 的工作原理，探測能力shodan 搜索語法：地區、應用、系統、時間等shodan 如何被用來輔助防禦設計一款漏洞掃描工具：漏洞掃描工具組成結構，工作流程TCP 協議、SYN 洪範攻擊TCP 協議的三次握手過程，半連接隊列以及全連接隊列的關係SYN 洪範攻擊如何進行 IP 地址僞造、如何僞造；SYN 洪範攻擊有關的參數，例如半連接隊列長度，重試時間間隔SYN FLOOD 攻擊的防禦措施利用 SSDP 協議進行 ddos 攻擊實現給出具體的放大倍數，攻擊流量，伺服器數量，每秒攻擊請求數量；相互之間進行計算chapter 03緩衝區溢出攻擊strcmp、strcpy 兩個函數在溢出攻擊中的利用，注意這兩個函數有什麽特點shellcodechar shellcode[] = "\xed\x1a"; // shellcode here int main { int *ret; ret = (int *)&ret + 2; (*ret) = (int)shellcode; }
软件安全技术20230410SSL，Secure Socket Layer：安全套接字层，参考 tls，用于通信双方来确认身份。通信时，双方先创建一个 ssl 安全层，用于传输数字证书，随后建立对称加密通道，正式确认双方身份后就可以开始通信了SSL Heartblood：心脏出血漏洞，在 OpenSSL 1.0 版本中，利用 "心跳扩展功能（heartbeat extension）"，一种用于发送心跳请求，确认对方是否可以进行通信的行为。该漏洞的利用过程如下：正常情况下发送正常的心跳请求时，发送如下信息：if you are there, please reply 3 letters 'hat' to me，此时对方会回复：hat 共 3 个字符构造恶意请求时，发送如下信息：if you are there, please reply 500 letters 'hat' to me，此时对方会回复：hat .... 共 500 个字符，造成内存泄露由于 heartbeat extension 存在于 SSL/TLS 协议的核心组件中，导致旧版本的 SSL 协议不再可靠软件安全所受威胁 3 大类：软件漏洞、恶意代码、软件侵权可信任第三方认证技术：例如可信任 CA（证书颁发机构，Certificate Authority），全球可信 CA 数量较少，在操作系统底层就写入了这些可信 CA 的唯一标识，在后续应用的过程中，接收到了可信 CA 的数字证书后，即可被认为通信是安全的PDRR（或 PD$R^2$） 模型：保护（Protection），检测（Detection），响应（Reaction），恢复（Restore）20230420shellcode 中一般使用 0x90 NOP 来占位置或填充内容，如果捕获到出现大量 NOP 指令的情况，就有可能是出现了攻击行为SEH（结构化异常处理） 异常攻击：Windows 在执行 int3 中断时，会让程序 EIP 运行到 栈上存放 SEH 入口的位置 执行 SEH 中断处理，若能修改 SEH 的入口为 shellcode，就能在触发 int3 中断时执行 shellcodeDWORD Shoot，windows 堆溢出漏洞：覆盖下一个 chunk 的 flink（fd） 和 blink（bk），由于发生解链的时候会有 node->fd->bk = node->bk，此时构造 node->fd = target addr，node->bk = shellcode，就能实现 *target addr = shellcode 的任意地址写操作DEP，数据执行保护，即 NX ENABLEDASLR，地址空间布局随机化ABR，数组越界读20230424早期的病毒会修改受害主机本地的 hosts 文件，在其中添加对应的内容例如：www.huorong.com 127.0.0.1，此时再去安装杀毒软件的时候，由于访问的是本地环回地址，就会因此出现各种无法访问的情况，也就无法安装杀毒软件DNS 服务器开放的查询端口是 53，使用的协议的 UDP，要求访问速度要快；DNS 服务器的 53 端口也会使用 TCP 协议进行通信，其目的是保证主从 DNS 服务器之间的数据同步（例如主机 DNS 添加了一个 A 记录，从服务器也要对应同步该 A 记录），称之为 DNS Zone Transfer密码加盐（Password Salting），为密码添加随机字符串后再进行后续处理，主要是为了防止彩虹表攻击等撞库行为物联网（Internet of Things，IoT）身份验证机制，挑战/响应认证方式（Challenge/Response），是一种零知识证明方案。指的是第一次握手，client 向 server 提出请求（需要提供一个值，例如 用户 id），要求进行身份验证第二次握手，server 在确定存在该 client 后，返回一个 随机数，作为 "提问"第三次握手，client 将自身 用户 id 与该 "提问" 合并，并生成 hash 指纹，返回给 server 作为应答第四次握手，server 将 client 返回得到的 hash 指纹，与 server 本身提取 用户 id + 随机数 进行 hash 指纹比较，若相同，则会向 client 返回 认证通过整个流程中，没有口令等隐私内容在互联网上传播，即使用 零知识证明 完成了身份认证参考，169.254.169.254，是一个 ipv4 空间中作为本地环回地址，云服务商 AWS 就会使用 http://169.254.169.254 作为一个特殊的查询地址，这个 API 可以允许云服务器实例访问一些有关自己的元数据信息，亚马逊云例如如下查询指令：curl http://169.254.169.254/latest/meta-data/public-ipv4，可以获得实例ID、安全组配置等等，利用该地址可以返回服务器信息。使用阿里云中可以采取如下查询方式（查询的 api 地址不同）：curl http://100.100.100.200/latest/meta-data腾讯云：curl http://metadata.tencentyun.com/latest/meta-data/20230427基本输入/输出系统（Basic Input/Output System，BIOS）按下电源开关，电源向主板等设备供电，CPU 从地址 FFFF:0000H 开始执行指令，进行 jmp 跳转到 BIOS 的真正启动地址BIOS 启动后进行加电后自检（Power-On Self-Test，POST），检查基本硬件设备是否能够正常使用硬件自检完成后，从用户设定的启动驱动来加载驱动程序，例如 U 盘启动、硬盘启动等统一可扩展固件接口（Unified Extension Firmware Interface，UEFI）主引导记录（Master Boot Record，MBR），BIOS 将 CPU 操作权限交给硬盘后，首先会加载硬盘第一个扇区，最前面 512 个字节的内容，这块内容中存放着关于该硬盘的信息，例如告诉操作系统到哪去获得系统启动盘20230504当使用 PEeditor 等软件查看一个 exe 可执行文件，发现其 .text，.data 段的大小为 0x0 的时候，很有可能是因为程序会因为被加壳了而没有真正跑起来，只有程序被真正装载到内存后才会显示出上述段的大小下面有一串汇编代码mov [ebp - 0x8], eax mov eax, [ebp - 0x4] cdq mov ecx, 3 idiv ecx mov [ebp - 0x8], edx该汇编代码的作用是：b = a % 3，其中 cdq 的作用是扩展 eax 寄存器的符号位；即 0x00000001 最高位为 0 表示正数；且该扩展会被放入到 edx 寄存器中，值为 0x00000000；若 0xfffffff1 扩展为 1，则 edx 中的值应为 0xffffffffidiv 的作用是进行除法，idiv ecx 表示将上述被 cdq 扩展后的 edx:eax 作为被除数，ecx 作为除数，即 $\frac{edx:eax}{ecx} = eax...edx$，然后将商放入 eax，余数放入 edx根据 % 的定义，则取 edx 的值返回给用户20230508汇编指令中，jbe，Jump if Below or Equal；jge，Jump if Greater of Equal，的作用都是大于等于就跳转，根据英文释义可以理解到，这两个操作指令的区别其实只有比较的 src 和 dst 的不同，例子如下# 表示比较 edx(src) 和 eax(dst), 当 edx 大于等于 eax, 则执行 jmp addr cmp eax, edx jbe addr # 表示比较 edx(src) 和 eax(dst), 当 eax 大于等于 edx, 则执行 jmp addr cmp eax, edx # 与上一个例子相同, 但是比较的大于号方向不同 jge addr # 可以简单理解为, jbe 和 jge 都是用 src 和 dst 进行比较, 根据其英文释义可以看出 cond 是 src < dst 还是 src > dst调用约定：cdecl，stdcall，fastcall；编译器在编译的时候，遇到一个 call 函数时，会预先去了解该函数的调用约定是什么，然后根据调用约定来添加汇编指令（例如遇到 fastcall 就是添加 mov；遇到 stdcall 就是添加 push）cdecl，从右往左压栈传参（采用 push），由父函数平衡栈帧stdcall，从右往左压栈传参（采用 push），由被 call 函数平衡栈帧fastcall，寄存器传参（采用 mov），由被 call 函数平衡栈帧；该调用约定使用寄存器传参，可以减少堆栈操作而提高函数调用的性能；不同的编译器使用多少个寄存器来传参的数量是不同的，例如在 windows 下使用的是 win64 约定，允许使用 4 个寄存器传参；而在 linux 下使用的 gcc 约定，可以使用 6 个寄存器传参20230511Handles 句柄，可以参考 with open(path, mode = 'rb') as fd 中的 fdWindows 注册表，保存操作系统与程序的配置信息ADVAPI32.dll，与注册表操作有关的 dll 库浏览器帮助对象，BHO，一种 COM 服务，或者说是接口服务20230515远程控制工具（Remote Access Trojan，RAT）僵尸网络（Botnets）通过泄露 got 的方式，获取 base，然后利用 base 找各种位置的内容，这个过程叫重定位20230518DLL 加载顺序劫持；由于 DLL 的默认搜索顺序为：应用程序目录，当前目录，系统目录，Windows 目录，PATH 环境目录；故通过劫持这些目录可以实现 DLL 加载劫持IAT Hooking，导入地址表劫持Inline Hook，修改实际的函数代码；相较于直接修改 IAT 表，Inline 的主要作用是直接修改被加载的函数中的内容，例如将某个加法操作数，修改成了 jmp backdoor，在调用到这个函数时，就会触发 backdoor 的 hook进程注入，恶意代码注入到正常运行的进程中，以此来绕过一些安全检查，由于恶意代码是依附于正常进程的，一般很难检测到DLL 注入，类似进程注入，让某个进程强行加载 DLL，原本恶意进程拥有较低的权限，恶意 dll 注入到某些有较高权限的正常进程后，恶意进程就拥有了和正常进程相同的权限，以绕过安全检查；其特征是：CreateRemoteThread()，这个函数能够创建一个在其它进程地址空间中运行的线程（也称作创建远程线程），以下是 demovictimProcess = openProcess(); hookStartAddress = VirtualAllocEx(victimProcess, ...); // return address, 在受害进程的内存空间中新增一块区域, 并返回该区域的指针, 后续将往这个区域中写入内容 WriteProcessMemory(victimProcess, hookStartAddress, injectDLL, ...); // 往受害进程的新增的这块区域写入恶意 dll handle = getMouduleHandle('kernel32.dll'); // 每个进程都有 kernel32.dll loadLibraryAddress = getProcessAddr(handle, 'LoadLibraryA'); // 获取 kernel32.dll 中 LoadLibraryA 的位置 // CreateRemoteThread(handle, wantToExecFunction, execFunctionArgs, ...) CreateRemoteThread(victimProcess, loadLibraryAddress, hookStartAddress, ...); // 让受害进程执行 loadLibraryA, 传入的参数是之前写入的 恶意dll 的开始地址在 ida 中发现函数调用方式： call ds:LoadLibraryA，这里的 ds，即为 Data Segment进程替换，将可执行文件重写到一个运行进程的内存空间，且该恶意代码与被替换的进程有相同的特权级CreateProcess(..., "svchost.exe", ..., CREATE_SUSPENDED, ...); // 创建一个 svchost 进程, 这里使用了一个 CREATE_SUSPENDED, 表示将进程一创建就先挂起 ZwUnmapViewOfSection(...); // 先将刚才 svchost 对应的内存空间转变为可写的 VirtualAllocEx(..., ImageBase, SizeOfImage, ...); // 先将恶意代码装载到内存中, 然后在下面将这块内存作为载体, 其数据再写到 svchost 的内存空间 writeProcessMemory(); // 将恶意代码写入到刚才 svchost 的内存空间 for (i = 0; i < NumberOfSections; i++) { WriteProcessMemory(..., section, ...); // 循环写恶意代码 } SetThreadContext(); // 修改 svchost 程序开始的入口点 ResumeThread(); // 恢复 svchost 进程, 即开始运行该 svchost20230522软件开发（SDL）核心安全需求：保密性确定哪些数据应当采用什么加密算法；口令不能被明文存储在后端，必须采用散列函数进行加密存储；传输账户信息等敏感内容的时候必须采用安全传输协议（例如 SSL/TLS）；系统日志文件不应当出现敏感或易被解读的敏感信息。完整性；主要是确保系统能按照预期的功能工作在输入一些表单信息的时候，需要对输入的数据集进行一些身份验证，防止一些注入攻击等系统功能的模块应当有备份以及校验和，防止被篡改，参考 windows 下的 dll 备份，以便使用者能验证模块的准确性和完整性可用性；高并发，负载均衡防止 DoS 攻击异地容灾可认证性；一些可认证需求，例如实名认证，单点登录支持等授权；访问控制，最小授权可审计性；日志必须精确记录信息，例如身份、时间戳等；日志保留时间必须符合要求。数据的加密；为了隐藏一些配置文件信息，例如网络特征等凯撒加密XOR 处理，可以视作一种对称加密Base64 加密，每 6 位用于处理一个字符，因为 $2^{6} = 64$，所以叫 Base64 加密20230525软件安全设计原则减少软件受攻击面最小授权原则，例如 windows 的 UAC权限分离原则纵深防御原则防火墙入侵检测，日志，数据加密威胁建模网络应对措施；网络行为的攻击基本流量属性包括 IP 地址、TCP 以及 UDP 端口，域名等；安全人员可以依据这些特征来配置安全策略；例如将某个恶意网站的域名重定向到本地一个无害的 ip，这种技术叫 DNS 沉洞 （sinkhole） 技术对抗检测（Operations Security，OPSEC）；域前置技术（Domain Fronting）一个 https 访问中，若远程端点被禁用了，可以在 https 实际访问该远程端点的包外层套一个合法的域，当客户端向 dns 服务器发起访问的时候，由于外面套的是一个合法的 dns，则会返回合法的 ip，但是本机却不用这个合法的 ip，而是访问在 https 中真正要访问的节点。这种技术通常用来躲避审查。20230529病毒自身的脫殼從原始程序入口點（Original Entry Point，OEP）開始運行程序；此時的 OEP 指向的地方叫脫殼存根病毒自身因爲加殼，無法讓 windows 直接使用導入表來進行，所以會大量利用 LoadLibrary 和 GetProcAddress 來動態裝載自身所需要的 Library尾部跳轉（tail jmp）：在病毒加載完必要的環境信息后，在尾部會使用 jmp 或者 call 進入到程序真正開始的地方去除程序的混淆程序作者自製的一種殼，在解密時經常使用 VirtualAlloc 函數來分配虛擬内存，然後將要處理的程序放在這個地方；可以使用 ollydbg 動態調試時，在程序將真正要運行的放入到上述所説的虛擬内存中后，將對應的内存 dump 出來即可20230601查殺引擎的使用文件簽名：傳入一個 trojan.js 文件給查殺引擎時，其首先會驗證 hash，若能匹配到特徵，會直接從數據庫中返回曾經分析的結果特徵值檢測：為 trojan.js 文件添加一些注釋，即修改了文件的簽名，此時有的殺毒引擎會通過檢測病毒的特徵值來確定病毒的情況病毒沙箱；一種能夠檢測出病毒在其中執行時使用過的資源，連接的網站等内容的模擬環境，通常將病毒放入到沙箱中進行分析，隨後再將特徵值編寫成查殺脚本添加到殺毒引擎中exam注意看實驗的内容，包括理論課上和實驗課裏的SDL 每個階段要做的事：设计，实施阶段需求階段；軟件安全開發核心安全需求：CIA 等設計階段；如何設計防止 sql 注入？如何数据净化，p202 - p203作業；第一次作業；p73 第 6 題；第二次作業；除了 SSRF；還應該關注 2021 OWASP TOP 10 相較於 2020 版本，有哪些新增的内容，關注這些新增的内容，理解其原理、防禦機制等另一本書，惡意代碼分析實踐DLL 注入、進程替換關注使用到的函數，及其參數ida 中能看懂是如何對數據加密和解密的，例如如何進行 xor 解密，使用的 key 是什麽，要能分析出 key 的值實驗内容必看
逆向工程Windows，i386第一章 - Ollydbg 基础字节序举例子：42 == 0x002a（这里是 2 字节，2a 是一个十六进制字节。00 是高字节，2a 是低字节）大端序：0x002a，即高低字节放在对应高低地址小端序：0x2a00，即高低字节放在相反高低地址单位db， | 位，1 bytes = 8 bits，0xdedw，DWORD，| 双字节，2 bytes = 16 bits，0xdeaddd | 四字节，4 bytes = 32 bits，0xdeadbeef第二章 - 汇编位数1 根地址线 = $2^1$ = 2 Bytes2 根地址线 = $2^2$ = 4 Bytes...10 根地址线 = $2^{10}$ = 1024 Bytes = 1 KB...32 根地址线（32 位），32 位 = $2^{32}$ = 4294967296 Bytes = 4 GB数据寄存器，32 位AL，AH：低 8 位，高 8 位AX：EAX 的低 16 位EAX：数据寄存器，默认存返回值、累加值，乘法、除法EBX：存基址ECX：COUNT，计数器（循环，每次循环会自动减 1），存字符串EDX：存数据tips：AX = accumulator，E = Extended通用寄存器EBP：Extended Base，堆栈基址指针寄存器，基址指针指向栈帧（Stack Frame）的开始地址ESP：Extended Stack，堆栈栈顶指针寄存器，栈顶指针指向栈帧的栈顶ESI：Extended Source，操作指向字符串源地址EDI：Extended Destination，操作指向字符串目标地址EIP：只能通过 RET，JMP 等操作修改移动栈帧的操作PUSH EBP，将当前栈顶指向地址存到 EBP 中，也就意味着 EBP 被移动到原来的 ESP 所在的位置MOVE ESP，抬升栈顶位置 ESP，这样更改后的 EBP 和 ESP 就形成一个新的栈帧PUSHAD，将寄存器中的值依次压入栈上，并且抬高栈帧，主要作用是保护寄存器信息，即保护现场。顺序为 EAX，ECX，EDX，EBX，ESP，EBP，ESI，EDI，POPAD，与 3 刚好相反，将栈上内容按 反序 弹出给寄存器，并且降低栈帧，从栈上取回寄存器信息，恢复现场RETN X，相当于 POP EIP，然后 ADD ESP X标志寄存器标志寄存器汇编指令集MOV，取地址（寄存器）中的值MOV 目的操作数，源操作数两个操作数的宽度必须一致LEA，取地址本身PHSH，POPPUSHAD，POPAD，将栈上的值依次压入几个通用寄存器JMP，跳转到地址RET，返回到 EIPCALL，机器码 E8 0E000000 表示调用当前地址的 下一条地址 + 0E 所在的 function| 地址 | 机器码 | 值 | 解释 | | -------------- | ------------------- | --------------------------------------- | -------------------------------- | | 0x0040100B | E8 0E000000 | CALL mailto:jmp.@user32.MessageBoxA | 跳转 | | 0x00401010 | CC | INT3 | HALT | | ... | | | | | 0x0040101E | FF25 08204000(小端) | jmp dword ptr ds:[<user32.MessageBoxA>] | 调用 user32.dll 中的 MessageBoxA |这里有一个精妙的是，在 CALL 的时候，将下一条地址压栈（该地址也作为函数的 ret 地址）到栈顶，然后根据栈顶的地址 +0E第三章 - PE 基础结构Windows PE 文件基础PE：Portable Executable File Format，可移植程序体虚拟内存地址（VA）相对虚拟内存地址（RVA），VA = 模块程序基址 + RVA文件偏移地址（FOA），就是未动态装载时、存在于外存的文件，只显示末3位FOA，RVA，VA 的关系FOA 某个函数 func：base = 0x400， offset = 0x80，则 func_foa = 0x480RVA 里的 func：base = 0x2000，offset = 0x80，则 func_rva = 0x2080​ 解释为，在即将装载到内存前，需要对齐页粒度，并且导入一些库、函数等VA 里的 func：base = 0x00400000，offset = 0x2080，则 func_va = 0x00402080数据目录，记录所有可能的数据类型地址，例如 导入表（PLT）、导出表、属性证书表、重定位表等节（section），.data 存放初始化的数据，.code 存放可执行的代码段内存对齐，操作系统对内存属性的设置以页（32位是1000H）为粒度单位，节在内存中的对其单位必须至少是一个页的大小，主要是为了提高管理效率文件对齐，物理扇区的大小（512字节，200H）作为一个粒度PE 文件结构程序开始：4D 5A找到 0x0 + 0x3C 的地方，值为 B8 00，代表 PE 的头在 0xB8转到 0XB8 的位置，值为 50 45，这就是 PE 文件开始的地方0xB8 + 0X28 即从 50 45 开始，往后 40 bytes 的位置就是程序的入口点DOS 头，保留这一程序是为了纪念发明者用开头 MZ 表示 .exe 程序其中包含了标识 PE 的起始地址节IMAGE_FILE_HEADER.NumberOfSections固定值，40个字节，节表的大小等于 节的数量 x 40节表即 PE 文件的 Section（.text，.data，.rodata等）的 indexPE 文件头部 = DOS头 + PE头 + 节表PE 文件身体 = 节内容第四章 - PE 基础结构2导出表：当前应用导出函数给别人用导入表（Import Table）：PE 文件装载时自带的所需函数表，记录了一个exe或者一个dll所用到的其他模块导出的函数，用了哪些模块(用了哪些dll)，用了dll的哪些函数，RVA = PE头 + 80h 或者 PE头 + 78h（这个 78h 的位置是导出表） + 8h（描述使用 4 bytes，前四字节是地址，后四字节是大小），Size = （描述使用 4bytes）使用 Winhex 查看内存打开 HelloWorld.exe，在 winhex 中 工具 - 打开 RAM 内存 - 找到 HelloWorld#xxxx 即可查看当前程序使用的内存。导入表单个导入表结构体共 16 bytes，有0000h，OriginalFirstThunk 桥1，里面存了一个地址，存的是 导入函数名字表（INT）的地址 0004h，时间戳0008h，链表的前一个结构000ch，指向链接库名字的指针0010h，FirshThunk 桥2，也存一个地址，存的是 导入函数地址表（IAT），在静态时，桥1 和 桥2 指向地址的内容相同，在动态加载之后，桥2的 IAT 变成正式装载的函数在内存中的入口地址（VA）。动态加载后这一块专门存放动态装载了的函数入口（导入函数的位置是紧挨着的）的地址叫 导入函数地址表（IAT）一个 双桥结构 保存了该程序所调用的一个 dll 的具体信息，可以理解为，有几个双桥结构，就表明该 pe 文件调用了几个 dll。导出表windows 装载器在进行 PE 装载时，会将导入表中登记的所有 DLL 一并载入，然后根据 DLL 的导出表对导入函数的描述修正导入表的 IAT 值。通过导出表，DLL 文件向调用它的程序或系统提供导出函数的名称、序号、以及入口地址等信息。 一个例子，RVA_BASE = 0x2000，FOA_BASE = 0x800nName：从 0x94c 开始，90 21 00 00 对应 0x800 + 0x190 = 0x990，也就对应着 nName = winresult.dll（用 00 来作为结尾）nBase 略NumberOfFunctions：定位到 0x954， 04 00 00 00 表示该 dll 只有四个函数NumberOfNames：定位到 0x958，04 00 00 00 表示该 dll 中，有名字的函数的个数只有四个AddressOfFunctions：定位到 0x95C，68 21 00 00，表示导出函数表的开始地址为 0x2168 - 0x2000 + 0x800 = 0x968然后定位到的 0x968 存放的某个函数 func_A 的 RVA，即 83 11 00 00，0x1183 + VA_BASE = 0x00401183，可以得到函数 func_A 的真实 VA然后接下来三个加上自己，总共四个函数的位置的指针是连续的栈加壳在程序执行前，先执行以获得更好的控制权在文件的末尾多增加一个 section，将程序的入口地址改成这个 section，在程序加载后会先执行壳里的代码执行完壳中的内容后，再从壳 section 中回到程序的入口点，加载程序考试实验部分如何判断一个 PE 文件是合法的kernel32.dll 某两个函数的作用导入表桥1、桥2，静动态变化导出表导出表的遍历、相关结构栈溢出的概念、理解该图壳应用