pwn

什么是pwn?

黑客俗语:攻击成功,破解成功,致力于二进制漏洞利用与挖掘,也就是已经编译成机器码的二进制程序。

image-20251013142537176elf文件,可以由,头(elf文件头(必须在文件头部),程序头/段表),节(代码(可执行的机器码),数据(执行机器码可能使用到数据),其他节),头(节头表)

ELF文件头表:记录ELF文件的组织结构
程序头表/段表:告诉系统如何创建进程,生成进程的可执行程序必须有这个结构,重定位文件不一定需要
节头表:记录elf文件的节区信息,用于链接的目标必须拥有此结构,其他类型文件不一定需要

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

image-20251013144442066

当运行磁盘中的elf文件,将磁盘中的elf文件加载到内存映像中,在磁盘中都是节,只有被加载到内存中才自成段

image-20251013144716611

虚拟内存用户空间每个进程一份
虚拟内存内核空间所有进程共享一份
虚拟内存mmap段中的动态链接库仅在物理内存中装载一份。

image-20251013150806456

windows编程中,给用户2g的内存空间用户空间(用户所写的代码和数据,控制用户程序所执行的相关控制结构:eg:栈),2g的内核内存空间(内核操作系统代码,因为在保护模式下,操作系统要代替用户管理硬件,因此大部分代码都用来进行硬件管理,和用户内存的分配与调度)

64位内存虚拟空间

动态存储区:并不会写死在硬盘上的elf文件,是载入内存后,动态申请的数据

静态存储区:写死在硬盘上的elf

stack:用来保存函数的执行状态,进行函数调用控制流控制的。因此也存放局部变量,方便与局部变量所在函数执行完一起释放

heap:提供给用户进行动态内存分配的。

image-20251013151652733

段与节

段视图用来标识文件如何在内存中执行
节视图用来标识文件如何在磁盘中如何生成和存储

image-20251013185133178

.text节:用来存放代码,实现用户想要执行的功能。
.rodata:用来存放程序运行期间不会修改的数据,一般指常量,字符串,和只读的全局变量
.plt节:解析动态链接函数的实际地址
.data节:存放已经初始化的全局变量
.got.plt:用来保存plt节解析到的动态链接函数地址。
.bss节:不占用磁盘空间,只占用内存空间,存放未初始化的全局变量

程序中的函数和变量统称为符号表,形参的存放与架构有关:

32位的时候,形参存放在栈中,在创建形参所属函数栈帧之前,先将形参压栈。
64位的时候,形参存放在寄存器中。

数据的存放:

大端序:低地址存放数据的高位,高地址存放地址的低位
eg:0x1234
内存存放:12 34
小端序:低地址存放数据的地位,高地址存放地址的高位
eg:0x1234
内存存放:34 12

leave:在函数返回时,回复父函数栈帧的指令
等效于:
mov esp,ebp
pop ebp

ret:在函数返回时,控制程序执行流返回到父函数的指令
等效于:
pop rip

一些突发问题和心得:

1.如果数据是按照小端序存储,但是发送payload的时候为什么可以按照程序写的顺序执行。

答案:「小端序的影响范围」—— 它只影响单个多字节数据内部的字节顺序,而不会改变不同数据块之间的整体顺序。
eg:b’a’*8(buf)+b’a’*4(rbp)+p32(0x1234)(system覆盖地址)
将这块数据发送的时候,会先发送b’a’*8然后将这块数据小端序存储在buf变量中,在发送b’a’*4同理覆盖rbp,最后发送system覆盖地址

2.为什么说32位内存空间是4g,每个程序在执行的时候虚拟内存空间都是4g?

虚拟内存(Virtual Memory) 技术 —— 它不是真实的物理内存,而是操作系统给每个程序 “画的一块独立的、连续的内存空间”,核心目标是 隔离程序、简化内存管理、充分利用物理内存。
虚拟内存的核心逻辑:“每个程序都以为自己独占内存”,连续的虚拟地址,会被操作系统通过 页表(Page Table) 映射到物理内存中不连续的 “内存页” 上。**

3.既然是映射在不同的内存页上,那为什么还会顺序执行?

程序的执行顺序由「虚拟内存地址的逻辑顺序」决定,CPU 通过页表将虚拟地址翻译成物理地址后,才能读取到对应地址的指令并执行。