栈迁移
栈迁移主要是为了解决栈溢出可以溢出空间大小不足的问题
主要用的就是利用 leave;ret;
leave; //mov esp,ebp; pop ebp;
ret ; // pop eip
通过在栈内写入地址,ret 返回的是栈顶数据,而栈顶地址是由esp寄存器的值决定的,也就是说如果控制了esp寄存器的数据,那么也就能够控制ret返回的栈顶数据。首先将栈中保存ebp数据的地址空间控制为我们想要栈顶地址,再利用两次leave操作,将esp寄存器中的值变成我们想让它成为的值。
ELF文件
ELF文件类型
ELF文件类型 | 说明 | 实例 |
---|
Relocatable File | 包含例代码和数据,可以被链接成可执行文件或共享目标文件 | Linux下的.o文件 | Executable File | 包含可以直接执行的程序,ELF可执行文件,一般没有扩展名 | /bin/bash文件 | Shared Object File | 包含代码和数据,和其他目标文件链接成新的目标文件,和可执行文件链接作为进程映像的一部分来允许 | Linux下的.so文件 | Core Dump File | 进程意外终止时可以产生的文件,存储着该进程的内存空间中的内容等信息 | Linux下的core dump |
ELF文件的结构
链接视角,通过节来进行划分
ELF header(ELF文件头) |
---|
Program header table(程序头表) 可选 | Section 1(节区1) | …… | Section n(节区n) | Section header table(节头表) |
运行视角,通过段来进行划分
ELF header(ELF文件头) |
---|
Program header table(程序头表) | Segment 1(段区1) | Segment 2(段区2) | …… | Section header table(节头表)可选 |
ELF文件头:位于文件最开始的位置,包含文件的一些基本信息,例如ELF文件类型,版本/ABI版本、目标机器、程序入口、段表和节表的位置和长度等。
节头表:一个文件包含很多节,这些节保证到节头表中,表中记录了节的名字、长度、偏移、读写权限等信息。
名称 | 内容 |
---|
代码节 | 可执行代码、字符串常量 | 数据节 | 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据 | BSS节 | 未初始化全局变量,未初始化全局静态变量 | 当装载至内存中后需要如下两个段 | | 栈 | 局部变量、函数参数 | 堆 | 动态内存分配 |
参考Linux[ELF]: ELF文件结构简单梳理_TaylorPotter的博客-CSDN博客_elf文件结构
栈迁移图解_夏天的知了的博客-CSDN博客
|