1、2022-8-13计算机系统安全原理与技术(第2版)12022-8-13计算机系统安全原理与技术(第2版)22022-8-13计算机系统安全原理与技术(第2版)32022-8-13计算机系统安全原理与技术(第2版)42022-8-13计算机系统安全原理与技术(第2版)532位位CPU所含有的寄存器有:所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP)1个标志寄存器(EFlags)2022-8-13计算机系统安全原理与技术(第2版)6
2、4个数据寄存器(EAX、EBX、ECX和EDX):数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。2022-8-13计算机系统安全原理与技术(第2版)72个变址寄存器(ESI和EDI):寄存器ESI、EDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。2022-8-13计算机系统安全原理与技术(第2版)82个指针寄存器(ESP和EBP):它们主要用于访问堆栈内的存储单元,并且规定:EBP为基指针(Base Pointer)寄存
3、器,用它可直接存取堆栈中的数据;ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。2022-8-13计算机系统安全原理与技术(第2版)96个段寄存器(ES、CS、SS、DS、FS和GS):段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。CPU内部的段寄存器:ECS代码段寄存器(Code Segment Register),EDS数据段寄存器(Data Segment Register),2022-8-13计算机系统安全原理与技术(第2版)10EES附加段寄存器
4、(Extra Segment Register),ESS堆栈段寄存器(Stack Segment Register),EFS附加段寄存器(Extra Segment Register),EGS附加段寄存器(Extra Segment Register),2022-8-13计算机系统安全原理与技术(第2版)111个指令指针寄存器(EIP):指令指针EIP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。12sub:减法指令第一个参数是被减数所在的寄存器,第二个参数是减数。add:加法指令第一个参数是被加数所在的寄存器,第二个参数是加数。注:sub和add指令常被
5、用来操作堆栈,例如,如果要在堆栈中分配四个四字节长整型数的空间,就没有必要调用四次push指令,简单调用sub esp,16(16=4*4)就可以了,当然也可以调用add指令恢复堆栈。13push:入栈指令32位平台,push指令将一个32位的操作数压入堆栈,导致esp减4。因为esp指向栈顶,且堆栈是向小地址生长的,所以会导致esp减4。pop:出桟指令跟push指令对应,在32位平台,pop指令将一个32的数弹出堆栈,会导致esp加4.pop指令的参数一般是寄存器,将栈顶的数据弹出到寄存器。2022-8-13计算机系统安全原理与技术(第2版)14call:调用函数call指令和jmp指令不
6、同,call指令会先把下一条要执行的指令入栈,然后跳到被调用的函数的地方。所以,call指令相当于push+jmp。ret:从函数返回ret指令和jmp指令不同,ret指令会先把函数的返回地址出桟,再跳到返回的地址。所以,ret指令相当于pop+jmp。栈帧的一般结构2022-8-13计算机系统安全原理与技术(第2版)15local1 local2 localnEBPRET地址参数1 参数2参数n关注函数调用时堆栈变化void foo(int m,int n)int local;local=m+n;void main()int t1=0 x1111;int t2=0 x2222;foo(t1,
7、t2);2022-8-13计算机系统安全原理与技术(第2版)16缓冲区溢出方式缓冲区溢出的原因是由于字符串处理等函数(strcpy、strcmp)没有对数组的越界加以监视和限制,结果覆盖了堆栈数据。有以下几种缓冲区溢出攻击方式:1)攻击者可用任意数据覆盖堆栈中变量的内容;2)覆盖堆栈中保存的寄存器内容,导致程序崩溃;3)把堆栈里面的返回地址覆盖,替换成一个自己指定的地方,而在这个个地方,可以植入一些精心设计了的代码以达到攻击的目的。2022-8-13计算机系统安全原理与技术(第2版)172022-8-13计算机系统安全原理与技术(第2版)182022-8-13计算机系统安全原理与技术(第2版)
8、19void come()printf(Success!);void test(int i)char buf12;/用于发生溢出的数组int addr4;int k=(int)&i-(int)buf;int go=(int)&come;addr0=(go24;addr1=(go24;addr2=(go24;addr3=go24;for(int j=0;j4;j+)bufk-j-1=addr3-j;void main()void test(int i);test(1);202022-8-13计算机系统安全原理与技术(第2版)212022-8-13计算机系统安全原理与技术(第2版)222022-8
9、-13计算机系统安全原理与技术(第2版)232022-8-13计算机系统安全原理与技术(第2版)242022-8-13计算机系统安全原理与技术(第2版)252022-8-13计算机系统安全原理与技术(第2版)262022-8-13计算机系统安全原理与技术(第2版)272022-8-13计算机系统安全原理与技术(第2版)282022-8-13计算机系统安全原理与技术(第2版)292022-8-13计算机系统安全原理与技术(第2版)302022-8-13计算机系统安全原理与技术(第2版)312022-8-13计算机系统安全原理与技术(第2版)322022-8-13计算机系统安全原理与技术(第2版)
10、332022-8-13计算机系统安全原理与技术(第2版)342022-8-13计算机系统安全原理与技术(第2版)352022-8-13计算机系统安全原理与技术(第2版)362022-8-13计算机系统安全原理与技术(第2版)372022-8-13计算机系统安全原理与技术(第2版)382022-8-13计算机系统安全原理与技术(第2版)392022-8-13计算机系统安全原理与技术(第2版)402022-8-13计算机系统安全原理与技术(第2版)412022-8-13计算机系统安全原理与技术(第2版)422022-8-13计算机系统安全原理与技术(第2版)432022-8-13计算机系统安全原理
11、与技术(第2版)442022-8-13计算机系统安全原理与技术(第2版)452022-8-13计算机系统安全原理与技术(第2版)462022-8-13计算机系统安全原理与技术(第2版)472022-8-13计算机系统安全原理与技术(第2版)482022-8-13计算机系统安全原理与技术(第2版)492022-8-13计算机系统安全原理与技术(第2版)502022-8-13计算机系统安全原理与技术(第2版)512022-8-13计算机系统安全原理与技术(第2版)522022-8-13计算机系统安全原理与技术(第2版)532022-8-13计算机系统安全原理与技术(第2版)542022-8-13计算机系统安全原理与技术(第2版)552022-8-13计算机系统安全原理与技术(第2版)562022-8-13计算机系统安全原理与技术(第2版)572022-8-13计算机系统安全原理与技术(第2版)58