2016
http://mooc.study.163.com/course/USTC-1000029000#/info
2015
http://mooc.study.163.com/course/USTC-1000072000#/info
实验楼,有实验环境
https://www.shiyanlou.com/courses/195
参考资料 深入理解Linux内核第三版
1.存储程序计算机工作模型
这个小节,理解两个问题
0x01什么是冯诺依曼体系结构?
冯诺依曼体系结构就是存储程序计算机,从如下两个方面来看:
硬件方面,计算机可以抽象成由CPU,内存组成,CPU和内存之间通过总线连接,
CPU内部有寄存器,如IP(Instruction Pointer)
16位的CPU叫IP
32位的CPU叫EIP
64位的CPU叫RIP
通常叫做IP,IP始终指向要执行的代码CS(Code Segment)
从程序员角度来看,
Memory holds instructions and data
CPU interpreter of instructions
0x02CPU识别什么样的指令
API:程序员与计算机的接口界面
ABI:程序与CPU的接口界面
2.32位X86汇编基础
这个小节,理解几种寄存器,几种寻址方式
0x01 通用寄存器
寄存器 | 描述 |
---|---|
AX,EAX | 累加器(Accumulator) |
BX,EBX | 基地址寄存器(Base Register) |
CX,ECX | 计数寄存器(Count Register) |
DX,EDX | 数据寄存器(Data Register) |
EBP | 堆栈基指针(Base Pointer) |
ESI | 变址寄存器(Index Register) |
EDI | 变址寄存器(Index Register) |
ESP | 堆栈顶指针(Stack Pointer) |
0x02 段寄存器
寄存器 | 描述 |
---|---|
CS | 代码段寄存器(Code Segment Register) |
DS | 数据段寄存器(Data Segment Register) |
ES | 附加段寄存器(Extra Segment Register) |
SS | 堆栈段寄存器(Stack Segment Register) |
FS | 附加段寄存器(Extra Segment Register) |
GS | 附加段寄存器(Extra Segment Register) |
0x03 几种寻址方式
movl %eax, %edx // edx = eax; 寄存器寻址(register mode)
movl $0x123, %edx // edx = 0x123; 立即数(immediate)
movl 0x123, %edx // edx = *(int32_t*)0x123; 直接寻址(direct)
movl (%ebx), %edx // edx = *(int32_t*)ebx; 间接寻址(indirect)
movl 4(%ebx), %edx // edx = *(int32_t*)(ebx+4); 基址寻址(displaced)
3.反汇编一个简单的C程序
这是一个实验,实验楼有提供环境
https://www.shiyanlou.com/courses/195/labs/555/document
反汇编一段代码,然后分析其汇编代码
0x01 编译下面这段代码
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
将这段代码保存成main.c,用如下命令来进行编译
gcc –S –o main.s main.c -m32
命令执行完后,生成main.s这个汇编文件
0x02 分析汇编代码
# 分析前先了解如下几个指令
pushl %eax
subl $4, %esp
movl %eax, (%esp)
popl %eax
movl (%esp), %eax
addl $4, %esp
call 0x12345
pushl %eip(*)
movl $0x12345, %eip(*)
ret
popl %eip(*)
enter
pushl %ebp
movl %esp, %ebp
leave
movl %ebp, %esp
popl %ebp
# 用(*)标注的寄存器,说明该寄存器不能被程序员直接修改,必须通过特定的指令才能使其改变
下图是main.s
main.s
下面是对这段代码的堆栈的分析
堆栈分析
网友评论