二进制基础

1.程序的编译与链接

从C源代码到可执行文件的生成过程为:

  • 编译
    由C语言代码生成汇编代码
  • 汇编
    由汇编代码生成机器码
  • 链接
    将多个机器码的目标文件链接成一个可执行文件

补充:

大端序与小端序区分图解:

fdg7Q0.png

2.Linux下的可执行文件格式ELF

可执行文件的分类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows:PE(Portable Executable)
可执行程序
.exe
动态链接库
.dll
静态链接库
.lib

Linux:ELF(Executable and Linkable Format)
可执行程序
.out
动态链接库
.so
静态链接库
.a

重点:

Linux下的可执行文件格式ELF结构图:

fdr3TA.png

磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像)

fdsi1f.png

在ELF由磁盘向内存映射的过程中,rodata、text、init 以及 ELF Header 合并成 Code段,而data、bss、got.plt 合并为Date段。

3.进程虚拟地址空间

基础知识:

地址以字节编码 虚拟内存用户空间每个进程一份

​ 虚拟内存内核空间所有进程共享一份

1Byte = 8bits 虚拟内存 mmap 段中的动态链接库仅在物理内存中装载一份

fd6Ul6.png

物理内存和虚拟内存映射关系:

假如物理有4GB内存,则对于程序执行的每一个进程,操作系统可分配等量物理内存的虚拟内存(即4GB)

原因:物理内存不可能同时使用

优点:既保护了物理内存不受更改,因为虚拟内存仅体现的是地址,同时又方便程序员提高了程序执行效率。

fdgLeU.png

左图为物理内存,右侧为进程执行时分配的虚拟内存

段与节区分:

  • 一个段包含多个 节
  • 段视图用于进程的内存区域的 rwx权限划分
  • 节视图用于ELF文件 编译链接时 与 在磁盘上存储时 的文件结构的组织
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
代码段(Text segment)包含了代码与只读数据
text 节
rodata 节
hash
dynsym 节
dynstr 节
plt 节
rel.got 节
……
数据段(Data segment)包含了可读可写数据
data 节
dynamic 节
got 节
got.plt 节
bss 节
……
栈段(Stack segment)

4.程序的装载与进程的执行

寄存器介绍:

amd64寄存器结构:

  • rax: 8Bytes
  • eax:4Bytes
  • ax: 2Bytes
  • ah: 1Bytes
  • al: 1Bytes

部分寄存器功能:

  • RIP
    存放当前执行的指令的地址
  • RSP
    存放当前栈帧的栈顶地址
  • RBP
    存放当前栈帧的栈底地址
  • RAX
    通用寄存器。存放函数返回值

静态链接的程序的执行过程(在执行main函数前系统先进行一些函数调用)

fdgIWn.png

动态链接的程序的执行过程

fdgozq.png

5.x86&amd64汇编简述

常用汇编指令介绍:

MOV:

1
2
3
4
5
MOV a, b                //把b的值赋值为a,即 a = b
MOV EAX,1234H // 执行结果(EAX) = 1234H
MOV EBX, EAX
MOV EAX, [00404011H] // [ ] 表示取地址内的值
MOV EAX, [ESI]

LEA:

1
2
3
LEA a, b                    //把b的有效地址送给指定的寄存器(a)
LEA EBX, ASC // 取 ASC 的地址存放至 EBX 寄存器中
LEA EAX, 6[ESI] //把 ESI+6 单元的32位地址送给 EAX

PUSH:

1
2
3
PUSH value                 //把目标值压栈,同时SP指针-1字长
PUSH 1234H
PUSH EAX

POP:

1
2
POP DEST                   //将栈顶的值弹出至目的存储位置,同时SP指针+1字长
POP EAX

LEAVE:

1
2
3
4
在函数返回时,恢复父函数栈帧的指令
等效于:
MOV ESP, EBP
POP EBP

RET:

1
2
3
在函数返回时,控制程序执行流返回父函数的指令
等效于:
POP RIP(这条指令实际是不存在的,不能直接向RIP寄存器传送数据)

**两种汇编格式 : **

fdgHyV.png