栈迁移栈迁移的原理栈迁移是因为栈溢出造成的漏洞,而溢出的又不多,通常刚好溢出到ebp和返回地址,无法构造参数,所以有时候不能直接利用,所以我们通过改变esp和ebp在我们可以改写的地方构造一个新的栈 我们在栈迁移中最常用的就是leave_ret这两个命令,下面解释一下这两个命令 123456leave:mov esp ebp 将ebp指向的地址给esppop ebp 将esp指向的地址存放的值赋值给ebpret:pop eip 将esp指向的地址存放的值赋值给eip leave指令即为mov esp ebp;pop ebp先将ebp赋给esp,此时esp与ebp位于了一
One-gadgetsOne-gadget 是 libc 中存在的一些执行 execve(‘/bin/sh’, NULL, NULL)的片段。当我们知道 libc 的版本,并且通过信息泄露得到 libc 的基址,就可以通过控制 EIP/RIP(覆盖.got.plt 或者函数返回地址等)执行该 gadgets 达到远程代码的执行目的,获取 shell。 下载 one_gadgets1sudo gem install one_gadget One_gadgets 的约束:在二进制漏洞利用(Pwn)中,选择 one_gadget 的核心在于匹配约束条件(Constr
栈保护全开的攻击手法(例)[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 → 正数;符号位 = 1
fmtstr::[HDCTF 2023]Minions 123456789101112131415161718192021222324252627282930313233int __fastcall main(int argc, const char **argv, const char **envp){ _BYTE buf[48]; // [rsp+0h] [rbp-30h] BYREF init(argc, argv, envp); vuln();"""int vuln(){ char buf[208]; // [rsp+0h] [
axb_2019_fmt64(格式化单字节修改–\x00 截断) 格式化字符串漏洞,第一步是测偏移:aaaa%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x 发现偏移为 8,我们可以通过 puts 表泄露 libc 基地址 1234payload = p64(puts_got) + b"%8$s" p.sendafter("Please tell me:",payload)puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'
格式化字符串利用方式参考资料:https://www.yuque.com/cyberangel/rg9gdm/vh62v6#4W6x9 格式化字符串漏洞的原理格式化字符串漏洞本质上是程序没有正确处理格式化字符串参数导致的安全问题。简单来说: • 编程语言中(如 C/C++)的printf、sprintf等函数支持格式化输出(比如%s输出字符串、%d输出数字)。 • 正常用法是:printf(“%s,%d”, 名字, 年龄)第一个参数是固定的格式化模板,后续是对应的数据参数。 tip):%d(打印一个整型),%s 字符串(打印一个字符串),%c(打印一个字符),%x(以十六进制打印)
绕过防御之击败PIE保护PIE的介绍Position-independent executable 地址无关可执行文件,该技术就是对于代码段、text 段、data 段、.bss 段等固定地址的一个防护手段,应用了 PIE 的程序在每次加载时都会变换加载基址,从而使 ropper 等工具无法得到准确的地址的一种防护。 但注意:PIE 只是 “整体偏移随机”,程序内部的相对地址不变! tip) 在计算机中,内存地址本质是一串二进制数(比如 64 位系统中是 64 位二进制),“最后 12 位” 就是这串二进制数的最低 12 位(最右侧的 12 位)。 也可以认为成是十六进制的最后 1.5 位
绕过防御之击败canary保护canary的认识和原理函数在开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证 cookie 信息是否合法,即栈帧销毁前测试该值是否被改动,如果不合法就停止运行。在 Linux 系统当中我们将这段 cookie 信息称为 Canary Canary 是一个低字节位 \x00 的十六进制数。 由于 Canary 在局部变量的后面,在 EBP 或 RBP 的前面,所以当攻击者覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,这就会导致栈保护检查失败而阻止 payload 的运行,从而避免漏洞被利用成功 123456789101112
对于send和sendline的思考 动作类型 常用函数 是否依赖/产生 \n 攻击时的注意点 输入 (Input) read(0, buf, n) 不依赖 只要发够 n 个字节就行,不加 \n 也能跑。 输入 (Input) gets / scanf 极度依赖 必须加 \n,否则程序死等,脚本卡死。 输出 (Output) printf 不自动加 泄露数据时,后面可能紧跟其他字符串,不好拆分。 输出 (Output) puts 自动加 \n 泄露数据非常干净,因为 \n 会把数据“推”出来。 特性 send(data) sendline(d