2019-2020-1 20175204 《信息安全系统设计基础》第三周学习总结

2019-2020-1 20175204 《信息安全系统设计基础》第三周学习总结

学习目标

1.理解逆向的概念
2.掌握X86汇编基础,能够阅读(反)汇编代码
3.了解ISA(指令集体系结构)
4.理解函数调用栈帧的概念,并能用GDB进行调试

实验楼学习内容总结

要点:

1.X86 寻址方式经历三代:
DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
8060的分段模式
IA32的带保护模式的平坦模式
2..p114: MOV相当于C语言的赋值”=“,注意ATT格式中的方向,另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop:
没有MOVS这条指令,只有MOVSB、MOVSW、MOVSD等,串操作需要明确数据类型,B表示BYTE,W表示WORD,D表示DWORD。MOVS符号位扩展,MOVZ零扩展(高位0填充)。
3.p150/p151: call/ret:
call指令:
call指令有一个目标,即指明被调用过程起始的指令地址。
call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。
ret指令:
ret指从栈中弹出地址,并跳转到这个位置。
ret指令返回到call指令后的那条指令。
4.p123: 结合C语言理解一下控制部分控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
while循环
while语句的通用形式:

body-statement```
GCC采用的方法,是使用条件分支,需要时省略循环体的第一次执行::
```if(!test-expr)
    goto done;
do
    body-statement
    while(test-expr);
done:```
for循环
for循环的通用形式:

for(init-expr;test-expr;update-expr)
body-statement

switch语句
根据一个整数索引值进行多重分支,执行switch语句的关键步骤是通过跳转表来访问代码位置,使结构变得更加高效。
5.p174: bt/frame/up/down :关于栈帧的gdb命令
关于栈帧的gdb命令:
```backtrace/bt n```
打印当前的函数调用栈的所有信息。
n是一个正整数,表示只打印栈顶上n层的栈信息。
-n表一个负整数,表示只打印栈底下n层的栈信息。
```frame n```
n为栈中的层编号,是一个从0开始的整数
该指令是移动到n指定的栈帧中去,并打印选中的栈的信息。
如果没有n,则打印当前帧的信息。
```up n```
表示向栈顶移动n层
```down n```
表示向栈底移动n层

***
##实验楼练习:
1.使用```gcc -s -o main.s main.c -m32```编译为汇编代码
![](https://img2018.cnblogs.com/blog/1592505/201910/1592505-20191013231331753-1384274049.png)
![](https://img2018.cnblogs.com/blog/1592505/201910/1592505-20191013231342714-1533094222.png)
![](https://img2018.cnblogs.com/blog/1592505/201910/1592505-20191013231458987-1353582449.png)
原文地址:https://www.cnblogs.com/zyzgl/p/11668982.html