PWN-二进制基础
二进制基础
1.程序的编译与链接
从C源代码到可执行文件的生成过程为:
- 编译
由C语言代码生成汇编代码 - 汇编
由汇编代码生成机器码 - 链接
将多个机器码的目标文件链接成一个可执行文件
补充:
大端序与小端序区分图解:
2.Linux下的可执行文件格式ELF
可执行文件的分类:
1 | Windows:PE(Portable Executable) |
重点:
Linux下的可执行文件格式ELF结构图:
磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像)
在ELF由磁盘向内存映射的过程中,rodata、text、init 以及 ELF Header 合并成 Code段,而data、bss、got.plt 合并为Date段。
3.进程虚拟地址空间
基础知识:
地址以字节编码 虚拟内存用户空间每个进程一份
虚拟内存内核空间所有进程共享一份
1Byte = 8bits 虚拟内存 mmap 段中的动态链接库仅在物理内存中装载一份

物理内存和虚拟内存映射关系:
假如物理有4GB内存,则对于程序执行的每一个进程,操作系统可分配等量物理内存的虚拟内存(即4GB)
原因:物理内存不可能同时使用
优点:既保护了物理内存不受更改,因为虚拟内存仅体现的是地址,同时又方便程序员提高了程序执行效率。
左图为物理内存,右侧为进程执行时分配的虚拟内存
段与节区分:
- 一个段包含多个 节
- 段视图用于进程的内存区域的 rwx权限划分
- 节视图用于ELF文件 编译链接时 与 在磁盘上存储时 的文件结构的组织
1 | 代码段(Text segment)包含了代码与只读数据 |
4.程序的装载与进程的执行
寄存器介绍:
amd64寄存器结构:
- rax: 8Bytes
- eax:4Bytes
- ax: 2Bytes
- ah: 1Bytes
- al: 1Bytes
部分寄存器功能:
- RIP
存放当前执行的指令的地址 - RSP
存放当前栈帧的栈顶地址 - RBP
存放当前栈帧的栈底地址 - RAX
通用寄存器。存放函数返回值
静态链接的程序的执行过程(在执行main函数前系统先进行一些函数调用)
动态链接的程序的执行过程
5.x86&amd64汇编简述
常用汇编指令介绍:
MOV:
1 | MOV a, b //把b的值赋值为a,即 a = b |
LEA:
1 | LEA a, b //把b的有效地址送给指定的寄存器(a) |
PUSH:
1 | PUSH value //把目标值压栈,同时SP指针-1字长 |
POP:
1 | POP DEST //将栈顶的值弹出至目的存储位置,同时SP指针+1字长 |
LEAVE:
1 | 在函数返回时,恢复父函数栈帧的指令 |
RET:
1 | 在函数返回时,控制程序执行流返回父函数的指令 |
**两种汇编格式 : **
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
ValineDisqus