PWN基础
程序的编译与链接
编译:由C语言代码生成汇编代码
汇编:由汇编代码生成机器码
链接:将多个机器码的目标文件链接成一个可执行文件
Linux下的可执行文件格式ELF
什么是可执行文件?
广义:文件中的数据是可执行代码的文件.out、.exe、.sh、.py
狭义:文件中的数据是机器码的文件.out、.exe、.dll、.so
可执行文件的分类
Windows:PE(Portable Executable)可执行程序
.exe
动态链接库.dll
静态链接库.lib
Linux:ELF(Executable and Linkable Format)可执行程序
.out
动态链接库.so
静态链接库.a
ELF文件头表(ELF header)
记录了LF文件的组织结构
程序头表/段表(Program header table)
告诉系统如何创建进程
生成进程的可执行文件必须拥有此结构
重定位文件不一定需要
节头表(Section header table)
记录了ELF文件的节区信息
用于链接的目标文件必须拥有此结构
其它类型目标文件不一定需要
磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像)
进程虚拟地址空间
段(segment)与节(section)
·代码段(Text segment)包含了代码与只读数据
.text节
.rodata节
.hash节
·.dynsym节
.dynstr节
pt节
.rel.got节
数据段(Data segment)包含了可读可写数据
·.data节
·.dynamic节
.got节
.got.plt节
.bss节
,栈段(Stack segment)
一个段包含多个节
段视图用于进程的内存区域的wx权限划分
节视图用于LF文件编译链接时与在磁盘
上存储时的文件结构的组织
程序数据是如何在内存中组织的
程序的编译与链接
大端序与小端序
程序的装载与进程的执行
部分寄存器的功能
RIP:存放当前执行的指令的地址
RSP:存放当前栈帧的栈顶地址
RBP:存放当前栈帧的栈底地址
RAX:通用寄存器。存放函数返回值