栈保护全开的攻击手法(例)[NewStarCTF 公开赛赛道]canary 更新: 2026-03-10 21:28:45原文: https://www.yuque.com/idcm/wnemg9/otddxogss6zar2df
特殊的栈溢出-整数溢出整数溢出介绍 上界溢出(加法溢出add)有符号上界溢出 有符号整数的补码存储规则32767+1=-32768—— 计算机中所有有符号整数都用 “补码” 表示,这是溢出后数值回绕的根本原因。 123456789101112131415161718192021222324252627282930313233343536373839404142434445461)先明确 short int 的基础属性存储长度:2 字节 = 16 位二进制(bit),只能存储 16 位的 0/1 组合;有符号规则:最高位左边第一位是 “符号位”:符号位 = 0 → 正数;符号位 =
对于got和hook的讨论在 PWN 中,篡改 __free_hook 和 free@GOT 都是为了在程序执行堆内存释放操作时劫持控制流)。虽然目的相似,但它们在内存位置、受到的保护机制以及适用场景上有很大的区别。 那么我们应该如何对 got 和 hook 进行选择呢:以下我们以 free 为例去分析 @GOT Global Offset TableGOT 表存放在 ELF 文件的.got.plt 数据段中。他的用处是记录主程序外部函数的真实地址,篡改他会改变主程序对相关函数(例如 free)的跳转调用,它仅影响主程序内部发起的 free 调用,地址和程序的基址相关。受 RELRO (Rel
寄存器知识RSP 和 RIP 是 CPU 中最重要的两个寄存器RSP (Stack Pointer) - 栈指针寄存器指向当前栈顶的位置 12345678910# RSP 的特点- 始终指向栈的最顶部- 栈是从高地址向低地址增长的- push 操作:rsp -= 8;然后存入数据- pop 操作:取出数据;然后 rsp += 8# 例子mov rsp, 0x7fff0000 # 设置栈顶位置push rax # rsp = 0x7ffff000 - 8 = 0x7feffff8pop rbx # rsp = 0x7feffff8
堆利用/glibc内存管理什么是堆?首先明确一下堆的概念,堆不同于栈,堆是(由操作系统内核或者堆管理器)动态分配的,**只有在程序需要时才会分配。**在CTFpwn程序中,栈是程序加载进内存后就会出现,而堆是由malloc,alloc,realloc函数分配内存之后才会出现。 堆(chunk)内存是一种允许程序在运行过程中动态分配和使用的内存区域。相比于栈内存和全局内存,堆内存没有固定的生命周期和固定的内存区域,程序可以动态地申请和释放不同大小的内存。被分配后,如果没有进行明确的释放操作,该堆内存区域都是一直有效的。 windows和linux下的堆分配,管理方式都不同,这里主要是l
可见字符shellcode可见字符 shellcode 的简单介绍:可见字符 shellcode 是一种在某些情况下非常实用的技术,特别是当程序对用户输入的字符串进行限制时。例如在只允许输入可见字符的情况下,就需要使用纯字符的 shellcode。 可见字符 shellcode 的原理:可见字符 shellcode 的原理是使用纯字符对应的汇编指令来完成 shellcode 的编写。例如:ASCLL 字符’P’对应的汇编指令时 push rax,’Q’对应的指令时 push rcx,以此类推。 可见字符 shellcode 运用示例:运用方法不难,我们直接用一道题目去解释可见字符 shellc
关于是否进行栈对齐的分析栈对齐的判断规则(两步法)栈对齐的核心要求:执行函数(如 system)时,rsp寄存器的值必须是 16 的整数倍(rsp % 16 == 0)。判断你的 payload 是否需要对齐,只需两步: 步骤 1:计算 payload 到 system_addr 的总长度 123456payload2 = ( b'a'*offset, # 填充数据:长度=offset字节 p64(pop_rdi_ret_addr),# Gadget1:8字节(64位地址固定8字节) p64(binsh_addr),
保存语雀笔记到本地下载 node1https://nodejs.org/zh-cn/download 配置环境变量 安装 yuque-dl管理员运行 cmd,输入以下命令 1npm i -g yuque-dl 配置环境变量 拉取语雀文件到本地1yuque-dl "文件连接" -d "本地存放文件" -t "token" 1yuque-dl "" -d "E:\yuque_note\BUUCTF" -t "你的yuque_session值" 下载完长这个样子,
内存空间的开辟与释放程序运行时的标准内存布局:代码段(.text )存放编译后的机器指令,只读,不可修改。CPU 会从这里读取指令执行 数据段(.data)已初始化的全局变量、静态变量。在程序运行前就分配好,生命周期是整个程序。 bss 段(.bss)存放未初始化的全局变量、静态变量。特点:系统自动清 0,在运行分配。 栈(stack)存放局部变量,函数参数,返回地址。自动分配自动释放。 堆(heap)是程序员手动申请的动态内存,不连续、空间大、手动管理、易泄露 bin 的分类体系:Tcache bin: 大小范围:0x20-0x410 单链表 线程私有缓存,LIFO,几乎无 size 检查,