第三章 程序的机器级表示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章程序的机器级表示

一、教材导读

本章学习内容是汇编语言,现在直接写汇编的机会不多了,但一定要能读懂,信息安全的核心思维方式“逆向”在这有很好很直接的体现,反汇编就是直接的逆向工程。

本章重点是3.7,但没有3.1-3.6的基础也是不行,如果想真正的提高动手能力,3.11如何用GDB调试汇编要好好练习一下,不过大多GDB 技巧大家都会了。

3.1-3.7中练习,重点:

3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34

p104, p105: X86 寻址方式经历三代:

1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全

2 8086的分段模式

3 IA32的带保护模式的平坦模式

p106: ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解;

p107:gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。

注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c

MAC OS中没有objdump, 有个基本等价的命令otool

Ubuntu中 gcc -S code.c (不带-O1)产生的代码更接近教材中代码(删除"."开头的语句)

p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。有些输出内容过多,我们可以使用more或less命令结合管道查看,也可以使用输出重定向来查看

od code.o | more

od code.o > code.txt

p109: gcc -S 产生的汇编中可以把以”.“开始的语句都删除了再阅读

p110: 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel 格式

p111: 表中不同数据的汇编代码后缀

p112: 这几个寄存器要深入理解,知道它们的用处。esi edi可以用来操纵数组,esp ebp用来操纵栈帧。对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al 都是独立的,我们通过下面例子说明:

假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax 指令后eax的值是多少?

解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.

p113: 结合表,深入理解各种寻址方式;理解操作数的三种类型:立即数、寄存器、存储器;

掌握有效地址的计算方式Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

p114: MOV相当于C语言的赋值”=“,注意ATT格式中的方向,

另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop

p115/p116: 栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。

p117: 指针就是地址;局部变量保存在寄存器中。

p119: 结合表理解一下算术和逻辑运算, 注意目的操作数都是什么类型特别注意一下减法是谁减去谁注意移位操作移位量可以是立即数或%cl中的数

p123: 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)

p124: 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)注意leal不改变条件码寄存器思考一下:CMP和SUB用在什么地方p125: SET指令根据t=a-b的结果设置条件码

p127: 跳转与标号

p130/p131: if-else 的汇编结构

p132/p133: do-while

p134/p135: while

p137/p138: for

p144/p145: switch

p149: IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.

p150/p151:call/ret; 函数返回值存在%eax中

p174: bt/frame/up/down :关于栈帧的gdb命令

二、实验练习

1.(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有

不同)使用

gcc–S –o main.s main.c -m32

命令编译成汇编代码,如下代码中的数字和函数名请自行修改以防与他人雷同

int g(int x){

return x + 3;

}

int f(int x){

return g(x);

}

int main(void){

return f(8) + 1;

}

1.

删除gcc产生代码中以"."开头的编译器指令,针对每条指令画出相应栈帧的情况

2.

3.

(选做)使用gdb的bt/frame/up/down 指令动态查看调用栈帧的情况

4.

相关文档
最新文档