AI-for-Security-Starting
面向安全、数据、算法人员的安全智能化起步指南
最近更新日期:2021/08/30
科班基础
数据结构
- 堆和栈的区别
答:栈是一种具有后进先出性质的数据结构;堆是一种经过排序的树形数据结构,通常我们所说的堆的数据结构,是指二叉堆,堆的特点是根节点的值最小或最大,且根节点的两个子树也是一个堆,由于堆的这个特性,常用来实现优先队列,好比是书架,虽然书的摆放是有顺序的,但是我们想要取任意一本时,不必要像栈一样取出前面所有的书。
操作系统
知识体系
常见问题
- 堆和栈的区别?
答:堆区(heap),一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;栈区(stack),由编译器自动分配释放,存放函数的参数值,局部变量的值,其操作方式类似于数据结构中的栈。
区别和联系:
1、申请方式
堆是由程序员自己申请并指明大小,如在c中使用malloc函数,与数据结构中的堆是两码事,分配方式类似于链表。而对于面向对象程序来说,new出来的任何对象,无论是对象内部的成员变量,局部变量,类变量,他们指向的对象都存储在堆内存中(但指针本身存在栈中);栈是由系统自动分配,如申明在一个函数中一个局部变量int b;系统自动在栈中为b开辟空间,存放函数的参数值,局部变量的值等
2、申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出;堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外对于大部分系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
3、申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是 一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
4、申请效率的比较
栈是系统自动分配,速度较快,但程序员是无法控制的;堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来很方便。 - 操作系统内核态和用户态
答:内核的功能:进程(线程)管理(进程或者线程的调度);低级存储器管理(用户程序逻辑空间到物理空间的物理地址的变换);中断和陷入管理(中断、异常和陷入,比如缺页中断);特权指令;系统调用(调用了设备驱动程序)。用户态切换到内核态的3种方式:系统调用(软中断)、异常、外围设备的中断(硬中断) - 进程和线程以及它们的区别
答:进程是具有一定独立功能的程序,是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。在运行时,只是暂用一些计数器、寄存器和栈。区别:1、调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 2、并发性:不仅进程之间可以并发,同一个进程的多个线程之间也可以并发执行 3、拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。 - 线程同步的方式有哪些?
答:互斥量、信号量、事件 - [进程的通信方式有哪些?]
- [什么是死锁?死锁产生的条件?死锁的处理基本策略和常用方法]
- [进程有哪几种状态?]
计算机网络
常见问题
- 浏览器输入URL后发生了什么?
答:(1)DNS域名解析,其中包括查找本地hosts文件、DNS缓存、DNS递归查询和迭代查询;(2)建立TCP连接,其中包括三次握手;(3)发送HTTP请求,其中请求报文的组成结构包括请求行、请求头部、空行和请求数据;(4)服务器处理请求,其中包括服务器调度资源文件处理用户请求和参数,并调用数据库信息返回结果;(5)返回响应结果,其中响应报文的组成结构包括状态行、消息报头、响应正文;(6)关闭TCP连接,其中包括四次握手;(7)浏览器解析HTML、CSS;(8)浏览器布局渲染 - TCP和UDP的区别
答:两者都是OSI模型中传输层协议,TCP提供可靠的通信传输,UDP则被常用于让广播和细节控制交给应用的通信传输。区别:TCP面向连接,UDP面向非连接,即发送前不需要建立连接;TCP提供可靠的服务(数据传输),UDP无法保证;TCP面向字节流,UDP面向报文;TCP数据传输慢,UDP数据传输快。 - [TCP三次握手和四次挥手的流程]
答:TCP三次握手:第一次握手:建立连接,客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后客户端进入SYN_SEND
状态,等待服务器确认。第二次握手:服务器端收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledge Number为x+1(Sequence Number+1);同时自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV
状态。第三次握手:客户端接收到SYN_ACK报文段。然后将Acknowledge Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器端都进入ESTABLISHED
状态,完成TCP三次握手。
基础语言
Java基础知识
- (Java中)堆和栈的区别
联系数据结构中、操作系统中、C++中、Java中堆和栈的区别
Python基础知识
- Python中基本数据类型元组tuple、列表list、字典dict、集合set之间的区别?
答:列表的特点是:可重复,类型可不同,类型不同也是和数据最本质的区别了;元组:元组和列表在结构上没有什么区别,唯一的差异在于元组是只读的,不能修改,元组用“()”表示;字典定义了键和值之间一对一的关系,但它们是以无序的方式存储的,字典的值可以是任意数据类型,最大的价值是查询;集合是一个无序不重复元素集,基本功能包括关系测试和消除重复元素,和字典类似,也是一组不重复key的集合,但不存储value - Python中list是怎么实现的?
答:Python中底层的list是用C语言的结构体表示的,ob_item
是用来表示保存元素的指针数组,allocated是ob_item
预先分配的内存总容量,list的初始化,当初始化一个空的list的时候,非常重要的是要知道list申请内存空间allocated的大小和list实际存储元素所占空间的大小ob_size
之间的关系,ob_size()
的大小和len(L)是一样的,通常会看到allocated的值要比ob_size
的值要大,这是为了避免每次有新元素加入list时都要调用realloc进行内存分配 - Python中list的get是怎么实现的?
答:list常见的操作函数有append、insert、pop、remove。以append为例,追加一个整数append(1)看看内部发生了什么?调用了内部的C函数app1(),list_resize()
会申请多余的空间以避免调用多次list_resize()
函数,list增长的模型是0,4,8,16,25,46,58,72,88,开辟了四个内存空间来存放list中的元素,存放的第一个元素是1,剩余的内存空间申请了但是没有使用。pop函数调用了listpop()函数,list_resize()
在函数listpop()内部被调用,如果这时ob_size
小于内存空间allocated的一半,这时的内存空间将会缩小。 - Python装饰器、迭代器、生成器原理及应用场景
- Python进程、线程和协程的区别及应用场景
- Python扫描速度的优化到GIL锁的原理和优化
- masscan扫描和nmap扫描等端口探测的原理和方式
基础算法
动态规划
- 动态规划套路详解
答:状态转移方程(如何穷举?)--->递归的暴力解法(自顶向下;穷举)--->带备忘录的递归解法(自顶向下;解决了重叠子问题;如何聪明的穷举?)--->非递归的动态规划解法(自底向上;如何聪明的穷举?)
网络空间安全
知识体系
应用安全
web安全
知识体系
从原理、利用、防御、绕过四个方面理解,例子:比如xss的原理,3种子类型原理,DOM型和反射型的区别?利用:能用xss干什么?怎么用?防御:输入过滤,输出转义,设置HTTP only;绕过:如何绕过http only,应用:具体带入到某种语言下,比如:php中防止xss的函数以及被绕过的情形。例子:比如ssrf的原理,利用:能用ssrf干什么?如何利用?gopher协议如何利用?无回显情况如何利用,应用:具体带入到某种语言下,比如需要php环境中安装expect扩展,才能用xxe进行命令执行。
常见问题
- [SQL注入的原理?子类型?子类型原理?能用来干什么?子类型利用方法?防御方法?绕过方法?]
- [XSS原理?子类型原理及子类型DOM型和反射型的区别?能用来干什么?利用方法?防御方法?绕过方法?] 答:XSS的本质是一种“HTML注入”,用户的数据被当成了HTML代码一部分来执行,从而混淆了原来的语义,产生了新的语义。如果网站使用了MVC架构,那么XSS发生在View层----在应用拼接变量到HTML页面时产生。所以在用户提交数据处进行输入检查的方案,其实并不是在真正发生攻击的地方做防御。想要根治XSS问题,可以列出所有XSS可能发生的场景(在HTML标签中输出、在HTML属性中输出、在script标签中输出、在事件中输出、在CSS中输出、在地址中输出),再一一解决(HtmlEncode、JavaScriptEncode、URLEncode、校验(防治伪协议类的XSS)+URLEncode)。
- [SSRF原理?能用SSRF干什么?利用方法?没有回显如何判断?]
- [XXE原理?能用XXE干什么?利用XXE进行命令执行时是如何做的?]
- [CSRF的原理,以及和CRLF的区别]
AI算法
知识体系
机器学习
理论基础
- 怎么防止过拟合?
答:a. 增加样本(data bias or small data的缘故),移除噪声。
b. 减少特征,保留重要的特征(可以用PCA等对特征进行降维)。
c. 对样本进行采样(类似bagging)。就是建树的时候,不是把所有的样本都作为输入,而是选择一个子集。
d. 对特征进行采样。类似样本采样一样, 每次建树的时候,只对部分的特征进行切分。 - 机器学习里面的偏差和方差有什么区别?
答:泛化误差可分解为偏差、方差与噪声之和。偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。 - 样本类别不平衡怎么办?
答:现有技术大体上有三类做法:假定正例少,负例多。第一类是直接对训练集的反类样例进行“欠采样”,即去除一个反例使得正、反例数目接近,然后再进行学习;第二类是对训练集里的正类样例进行“过采样”,即增加一些正例使得正、反例数目接近,然后再进行学习;第三类则是直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将“再缩放”嵌入到其决策过程中,称为“阈值移动”,但是实际操作却可能有问题,主要因为“训练集是真实样本总体的无偏采样”这个假设往往不成立,未必能有效的基于训练集观测几率来推断出真实几率。 - L1和L2有什么区别?
答:L0:计算非零个数,用于产生绝对的稀疏性;L1:计算绝对值之和,用于产生稀疏性,对于large-scale的问题来说,可以减少存储空间;L2:计算平方和再开根号,能够起到正则化的作用,L2范数更多的是防止过拟合,提高模型的泛化能力,并且让优化求解变得稳定快速,这是因为加入L2范数之和,满足了强凸。
从最优化问题解的平滑性来看,L1范数的最优解相对于L2范数要少,但其往往是最优解,而L2的解很多,但更多的倾向于某种局部解。 - 为什么L1能得到稀疏解?
答:L1、L2两种正则能不能把最优的x变成0,取决于原先的函数在0点处的导数。如果本来导数不为0,那么施加L2正则后导数依然不为0,最优的x也不会变成0;而施加L1正则时,只要正则项的系数C,大于原先函数在0点处的导数的绝对值,x=0就会变成一个极小值点。上面只分析了一个参数x,事实上L1正则会使许多参数的最优值变成0,这样模型就稀疏了。 - 梯度消失、爆炸是怎么回事?
答:梯度爆炸和梯度消失根源:深度神经网络和反向传播(sigmoid激活函数)。都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题 - 如何用测试集数据找到训练集数据中与其分布相似的数据?
答:kaggle比赛里常见的套路是adversarial validation,用来对train test数据集的分布做探测。原理:把数据来源于train还是test设置为待预测的目标label,label=1:数据来源于test数据集,label=0,数据来源于train数据集。train test拼接,然后训练模型M,用模型M对train数据集打分,observation分数越高,说明train上该observation越接近test数据集的分布。取出train上分数最高的N个observation即可。目的:用来对train test数据集的分布做探测,如果分类器不能识别成功train/test,那么可以说train/test有相同的分布;处理bad case;缺点:over fitting in sample,降低了泛化性,而最终的模型还是要用到测试集之外的。实践经验:garbage in,garbage out,宁可花更大代价提升数据。
算法原理
- xgb的原理
- GBDT的原理
算法特性
- lr怎么改善?
答:lr和gbdt相结合,用gbdt来学习组合特征,再结合lr固有的稀疏特征,组成新的特征向量
算法比较
- RF、GBDT和XGB比较
- lgb和xgb有什么区别
杂项
- 机器学习各种算法怎么调参?
- RF、GBDT是怎么调参的?哪些参数比较重要?一般选多少?
答:思路:全程联系偏差和方差。
思路展开:联系RF、GBDT对应到偏差、方差,具体来说,拆分RF、GBDT为多个单个树,再对应到偏差、方差,再联系单个树的特性和树之间的关联性,对应到两类参数:过程影响类参数和子模型影响类参数。
具体描述:对过程影响类参数进行调整,毕竟它们对整体模型性能的影响最大,然后依据经验,在子模型影响类参数中选择对整体模型性能影响最大的参数,进行下一步调参。联系RF、GBDT对应到Bagging和Boosting:正由于Bagging的训练过程旨在降低方差,而Boosting的训练过程旨在降低偏差,过程影响类的参数能够引起整体模型性能的大幅度变化。一般来说,在此前提下,我们继续微调子模型影响类的参数,从而进一步提高模型的性能。例如RF的过程影响类参数只有“子模型数”,而GBDT的过程影响类参数有“子模型数”和“学习率”,需要一起考虑调整,GBDT子模型影响参数有:最大叶节点数、最大树深度、分裂所需最小样本数、叶节点最小样本数、子采样率、分裂时考虑的最大特征数等。最大叶节点数、最大树深度等控制子模型结构的参数是与Random Forest一致的。类似“分裂时考虑的最大特征数”、“子采样率”,也会造成子模型间的关联度降低,整体模型的方差减小。
- RF、GBDT是怎么调参的?哪些参数比较重要?一般选多少?
深度学习
知识体系
神经网络
深度学习VS机器学习
- [深度学习与机器学习有什么区别?应用场景有哪些区别?哪些应用场景用机器学习?哪些场景用深度学习?为什么?]
答:从数据集角度来说,目前深度学习表现比较好的领域主要是图像、语音、自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适合用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等因素,将这种元素打乱,并不会影响相关的结果。这种情况就比较适合用机器学习来处理。(此处是从数据集的特性来说,如果从数据集的大小来说,深度学习不适合处理小数据集)
主要参考来源
- 白帽子讲web安全-吴翰清
- 机器学习-周志华
- 数据驱动安全-Jay Jacobs、Bob Rudis
- 互联网企业安全高级指南-赵彦、江虎、胡乾威