无标题
title: 可执行文件装载与虚拟内存date: 2025-06-28 20:16:36categories: - PWN -ELF文件格式 tags:
无标题
跟着ctfwiki和特训营
Linux常用命令
终端命令格式command [-options] [parameter] 说明: ·command :命令名,相应功能的英文单词或单词的缩写·[-options] :选项,可用来对命令进行控制,也可以省略·parameter :传给命令的参数,可以是 零个、一个 或者 多个 目录操作命令 cd、pwd、ls、mkdir、rmdir、du 命令 / 选项组合 功能说明 基础命令 cd 切换到另一个目录 pwd 打印当前所在目录(print working directory ) ls 列出目录内容 ls 常用选项 ls -l 长格式输出文件,一个文件显示一行(简写 ll ) ls -a 显示以 . 开头的隐藏文件(默认不显示隐藏文件 ) ls -d 显示目录本身,而非目录下的文件(默认目录会展开显示内容 ) ls -lh 长格式输出 + 字节数转 K/M/G (人性化阅读 ) ls -t 按修改时间从晚到早排序文件(最近修改的先显示 ) ls -tr 按修改时间从早到晚排序文件(最近修改的后显示 ...
Linux目录结构
根目录的子目录 目录 内容 /bin bin是Binary的缩写, 这个目录存放着最经常使用的命令,由系统、系统管理员和用户共享 /boot 这里存放的是启动Linux时使用的一些核心文件,包括一些链接文件以及镜像文件 /dev dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的 /etc 大多数重要的系统配置文件都在/etc目录下,该目录包含的数据类似于Windows控制面板中的数据 /home 普通用户的家目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的 /lib 库文件,包括系统和用户所需要的各种程序的文件 /lost+found 每个分区在其上目录中都有一个lost+found。故障期间保存的文件在这里 /media linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下 /...
Canary
介绍Stack Canaries(取名自地下煤矿的金丝雀,因为它能比矿工更早地发现煤气泄漏,有预警的作用)是一种用于对抗栈溢出攻击的技术,即SSP安全机制,有时也叫作Stack cookie。Canary 的值是栈上的一个随机数,在程序启动时随机生成并保存在比函数返回地址更低的位置。由干栈溢出从低地址向高地址进行覆盖,因此攻击者要想控制函数的返回指针,就一定要先盖到Canary。程序只需要在函数返回前检查Canary是否被篡改,就可以达到保护的目的。 示例简单程序c#include<stdio.h>void main(){ char buf[10]; scanf("%s",buf);} 在 GCC 中使用 Canary可以在 GCC 中使用以下参数设置 Canary: plaintext-fstack-protector 启用保护,不过只为局部变量中含有数组的函数插入保护-fstack-protector-all 启用保护,为所有函数插入保护-fstack-protector-strong 增加对包含局部数组定义和...
NX
简介 No-eXecute(NX),表示不可执行,其原理是将数据所在的内存页(例如堆和栈)标识为不可执行,如果程序产生溢出转入执行shellcode时,CPU就会抛出异常。通常我们使用可执行空间保护(executable space protection)作为一个统称,来描述这种防止传统代码注入攻击的技术——攻击者将恶意代码注入正在运行的程序中,然后使用内存损坏漏洞将控制流重定向到该代码。实施这种保护的技术有多种名称,在 Windows上称为数据执行保护(DEP),在Linux上则有 NX、WX、Pax和 Exec Shield 等。 NX的实现需要结合软件和硬件共同完成。首先在硬件层面,它利用处理器的NX位,对相应页表项中的第63位进行设置,设置为1表示内容不可执行,设置为0则表示内容可执行。一旦程序计数器(PC)被放到受保护的页面内,就会触发硬件层面的异常。其次,在软件层面,操作系统需要支持 NX,以便正确配置页表,但有时这会给自修改代码或者动态生成的代码(JT编译代码)带来一些问题,这在浏览器上很常见。这时,软件需要使用适当的API来分配内存,例如Wimdows上使用 V...
1-栈介绍
基本栈介绍栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。 高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,程序的栈是从进程地址空间的高地址向低地址增长的。 函数调用栈核心组件栈指针 (SP) x86: ESP (32位), x64: RSP (64位) 始终指向栈顶位置 push/pop 指令自动修改 SP 基址指针 (BP) x86: EBP, x64: RBP 作为当前栈帧的基准点 用于定位参数和局部变量 指令指针 (IP) x86: EIP, x64: RIP 存储下一条执行指令地址 call/ret 指令修改 IP 函数调用过程(关键!)调用者 (Caller) 准备; 1. 参数压栈(从右向左)push arg3push arg2pu...
2-栈溢出原理
介绍栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是: 程序必须向栈上写入数据。 写入的数据大小没有被良好地控制。 基本示例最典型的栈溢出利用是覆盖程序的返回地址为攻击者所控制的地址,当然需要确保这个地址所在的段具有可执行权限。下面,我们举一个简单的例子: #include <stdio.h>#include <string.h>void success(void){ puts("You Hava already controlled it.");}void vulnerable(void){ char s[12]; gets(s); puts(s); return;}int main(int argc, ch...
装载与汇编
装载 汇编两种语法风格 功能 / 场景 Intel 汇编格式 AT&T 汇编格式 立即数传送到寄存器 mov eax, 8 movl $8, %eax 带十六进制立即数的传送 mov ebx, 0ffffh movl $0xffff, %ebx 触发系统调用(中断) int 80h int $0x80 内存数据传送到寄存器 mov eax, [ecx] movl (%ecx), %eax 函数 / 过程(sum 示例) sum:push ebpmov ebp, espmov eax, [ebp+12]add eax, [ebp+8]pop ebpretn sum:pushl %ebpmovl %esp, %ebpmovl 12(%ebp), %eaxaddl 8(%ebp), %eaxpopl %ebpret 寄存器与数据类型寄存器 寄存器 位数 主要功能 特殊用途 子寄存器关系 RAX 64-bit 函数返回值、算术运算 系统调用号(Syscall) RAX → EAX → AX → AH/AL ...








