缓冲区溢出

例如:把10个字节的数据存入到只分配了8个字节的空间缓冲区

原理:

简单地说,缓冲区溢出就是向一个有限空间的缓冲区拷贝了过长的字符串,覆盖相邻的存储单元,这将会引起程序运行失败。

因为变量保存在堆栈当中,当发生缓冲区溢出的时候,存储在堆栈中的函数返回地址也会被覆盖,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

一个程序在内存中通常分为程序段,数据段和堆栈段3部分。动态数据则通过堆栈来存放。

当程序中发生函数调用时,计算机做如下操作:

  • 首先把参数压入堆栈;

  • 然后保存指令寄存器(IP)中的内容作为返回地址(RET);

  • 第三个放入堆栈的是基址寄存器(BP):然后把当前的栈指针(SP)拷贝到BP,作为新的基地址;

  • 最后为本地变量留出一定空间,把SP减去适当的数值。

函数调用图示

BP RET被多余的str覆盖,而覆盖之处恰好就是想要执行程序的入口!

利用空指针加快猜中的可能性

BF 算法

最原始的比较算法,一个一个的比

KMP 算法

原理

KMP(D.E. Knuth, J.H.Morris, and V.R.Pratt )主要是基于对BF算法的改进:BF算法只是简单的每次移动一个字符位置,并没有考虑已匹配成功部分的信息。其实这些信息是可以利用的,此即所谓的“前缀模式”----模式中不同部分存在的相同子串。根据前缀模式可以使模式向前推进若干字符位置(依前缀模式长度而定),而不只是一个字符,避免了重复比较,同时也实现了无回朔。

假定试探第j个位置时,匹配失败发生在模式字符x[i]=a ,文本字符 y[i+j]=b;

当转移的时候,模式集的V能够与文本中的u的一些后缀相匹配,最长的V我们定义为u的边界标记(tagged border )。kmpNext[i] 定义为x[0 .. i-1] 的最长边界, kmpNext[0] 定义为-1 。

算法:

构建KMPNEXT表:

  • kmpNext[0]= -1  任何串的第一个字符的kmpNext规定为-1。

  • kmpNext[j]= -1   模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j] (1≤k<j))。
    如:T=”abCabCad” 则 kmpNext[6]=-1

  • kmpNext[j]=k    模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。 即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1] 且T[j] != T[k].(1≤k<j);
    如:T=”abCabhad” ,则 kmpNext[5]=2

  • kmpNext[j]=0   意义:除(1)(2)(3)的其他情况。

移动:

i - KMPNEXT[i] 的位移

i代表模式串匹配失败的下标,从0开始

BM 算法

原理

BM算法的关键是找出不必要的比较。进行比较时从字符串的右端而不是左端开始比较,当比较不匹配时,可直接向右移若干个位置;当被比较的字符相等时,则继续比较其前面的字符。如果成功次数等于模式串长度,则匹配成功。

AC 算法

  • 转向函数

  • 失效函数

  • 输出函数
    AC1

转向函数

比较好建立,直接画树

失效函数+输出函数

  • 划分深度d0=0, d1=d3=1, d2=d6=d4=2...

  • 建立失效函数。首先,令所有深度为1的状态s的函数值为f(s) = 0。假设所有深度小于d的状态的f值都已经被算出了,那么深度为d的状态的失效函数值将根据深度小于d的状态的失效函数值来计算。

    • state = f(r)

    • 记f(s) = g(state, a), g(r, a) = s

在同时根据f也会输出新的输出集合

比如: f(5) = 2. 把2的输出集合同样也输出到5的输出集合中了。

双数组 AC 算法

普通转向函数占用内存太大。用三个数组解决。

  • Next 表 —— 下标是位置的偏移量,输出时状态值

  • Base 表 —— 下标是状态值,输出时Base值

  • Check 表 —— 下标是状态值,输出时下标状态的父状态的值

一层一层走

Base: 一点一点偏移。。相对前一个状态的偏移-现在的ASCII码=现在状态的Base值




GST 算法

后序按照字典排列

LCT最长公共子序列

  • m*n数组初始化为0

  • s1[m] = s2[n], L[m,n]= L[m-1,n-1]+1

  • s1[m] != s2[n],L[m,n]= max{L[m,n-1], L[m-1,n]}. 回朔时谁大谁回朔到谁,相等走一个

KD 树

KD树
kd树是做多维数据索引时候用到的一种数据结构:k-d树是二叉检索树的扩展,k-d树的每一层将空间分成两个。树的顶层结点按某一维进行划分,递归,每次划分均选择合适的维进行划分,各个维循环往复。划分要使得在每次划分后,大约一半的点落入一侧,而另一半落入另一侧。当一个结点中的点数少于给定的最大点数时,划分结束。

分散开的划分,方差。或者其他更加科学的做法。

检索效率O(lgn)

高度不超过log2n

k-means 算法

在该算法中,每个簇用该簇中对象的平均值来表示

给定簇个数,随便找簇个数个值(一般最小原则),然后其他点,和簇中的值比较,最近的,归类。取平均值得到新簇。

直到不变

k-medoids算法

在该算法中,每个簇用接近聚类中心的一个对象来表示。

中心点的选取:从当前分类中选取这样一个点——它到其他所有(当前分类中的)点的距离之和最小——作为中心点。

再用这个点分别与所有点(最近)

DBSCAN算法

DBSCAN是一种利用样本密度进行测量比较的聚类算法。算法认为若样本点在以它为圆心Eps距离为半径的区域内的少数类样本数大于阈值MinPts,那么该样本点即为核心点。核心点与其Eps范围内的邻居形成簇。如果簇间存在重合,则这些簇需要合并。

给定半径,给定距离

原文地址:http://life.rccoder.net/heart-thinking/1167.html


rccoder
1.2k 声望37 粉丝