一种被忽视的构造和整数溢出重现

从POP3服务器缓冲区溢出漏洞看网络服务安全与漏洞挖掘 缓冲区溢出是网络安全领域中的一种经典漏洞类型,其原理在于程序向固定长度的内存缓冲区写入超出其容量的数据,导致相邻内存区域被覆盖。这种漏洞常因开发者使用不安全的字符串处理函数(如strcpy)且缺乏严格的输入验证所致。从技术价值看,缓冲区溢出不仅可引发服务崩溃(拒绝服务),在特定条件下还可能被利用实现任意代码执行,危害极大。在应用场景上,网络服务程序(如邮件服务器、Web服务器)因需处理外部输入,是此类漏洞的高发区。本文以Baby POP3服务器1.04版的拒绝服务漏洞为具体案例,通过复现与分析,深入剖析了缓 阅读详情

一种被忽视的构造和整数溢出重现

Michael Howard
Secure Windows Initiative

摘要:Michael Howard 研究了一种常常被忽略的代码构造,这种构造可能会导致严重的缓冲区溢出问题,然后介绍了一种在没有溢出副作用的情况下执行算术运算的替代方法。

*

谈谈构造

很奇怪,有如此之多的安全指导文档提示人们注意危险的函数。在 C 和 C++ 中,很少有危险的函数,不过,有一件事是肯定的,有许多危险的开发人员正在使用 C 和 C++。

因此,您可能会问,“Michael,您究竟要讨论什么?”

我得承认,我听腻了一些文档说的所谓某些函数是危险的,您应该使用更安全的类型来代替它们。例如,“不要使用 strcpy,它是危险的。您应该改用 strncpy,因为它是安全的。”没有什么比这更远离实际情况的了。有可能使用 strcpy 的代码是安全的,而调用 strncpy 的却是不安全的代码。

像 strcpy 这样的函数是有潜在 危险的,因为源数据比目标缓冲区大,并且它来自不受信任的源。如果源数据来自一个受信任的源,并且在复制之前经过了有效性测试,则调用 strcpy 就是安全的:

void func(char *p) {
   const int MAX = 10;
   char buf[MAX + 1];
   memset(buf,0,sizeof(buf));

   if (p && strlen(p) <= MAX) 
      strcpy(buf,p);
}

信不信由您,我正好要在某处用到这个例子。有一种常常被忽略的构造可能会导致缓冲区溢出,它不是函数调用。它是这样的:

while () 
   *d++ = *s++;

此处没有函数调用,这是 DCOM 中导致出现 Blaster worm 蠕虫病毒的编码构造。在 Buffer Overrun In RPC Interface Could Allow Code Execution 中,您可以读到更多关于此病毒的修复程序的内容。

该代码如下所示:

HRESULT GetMachineName(WCHAR *pwszPath) {
    WCHAR  wszMachineName[N + 1]) 
    LPWSTR pwszServerName = wszMachineName;
    while (*pwszPath != L'//' )
        *pwszServerName++ = *pwszPath++;   
    ...
}

这里的问题在于,while 循环是以源字符串中的一些字符为界的。它没有为目标缓冲区的大小所限制。换句话说,如果源数据不受信任,就会出现缓冲区溢出。

我编写了一段简单的 Perl 脚本来搜索 C 和 C++ 代码中这些类型的构造。请注意,这段脚本标记的每个实例并不是一个缺陷,您需要确定是否源数据是受信任的。

use strict;
use File::Find;

my $RECURSE = 1;

###################################################
foreach(@ARGV) {
  next if /^-./;
  if ($RECURSE) {
      finddepth(/&processFile,$_);
  } else {
      find(/&processFile,$_);
  }
}
###################################################
sub processFile {
  my $FILE;
  my $filename = $_;
  
  if (!$RECURSE && ($File::Find::topdir ne $File::Find::dir)) {
    $File::Find::prune = 1;
    return;
  } 
  
  # Only accept C/C++ and header extensions
  return if (!(//.[ch](?:pp|xx)?$/i));
     
  warn "$!/n" unless open FILE, "<" . $filename;
  
  # reset line number
  $. = 0;

  while () {
    chomp;
    s/^/s+//;
    s//s+$//;

  if (//*/w+/+/+/s{0,}=/s{0,}/*/w+/+/+) {
   print $filename . " " . $_ . "/n";
  }
}

注这段脚本只查找 *p++ 构造,而不查找 *++p 构造。

假定您发现了一个缺陷,使代码更安全的一种方法是限制被复制的数据不大于目标缓冲区:

HRESULT GetMachineName(WCHAR *pwszPath) {
    WCHAR  wszMachineName[N + 1]) 
    LPWSTR pwszServerName = wszMachineName;

    size_t cbMachineName = N;
    while (*pwszPath != L'//' && --cbMachineName)
        *pwszServerName++ = *pwszPath++;   
    ...
}

最后,对不为目标缓冲区的大小所限制的任何内存复制函数或构造都应该进行严格检查。

关于整数溢出的更多介绍

在前面的文章 Reviewing Code for Integer Manipulation Vulnerabilities 中,我讨论了与所谓整数溢出 的简单数学运算相关的安全性缺陷。

最近,作为正在进行的可信赖计算工程系列 (Trustworthy Computing Engineering Series) 的一部分,我给 Microsoft 的工程师做了一次关于整数溢出的讲座。在讲座中,我概述了如何发现整数溢出以及如何修复整数溢出。让我感到吃惊的是,我接收到的许多电子邮件都说我的补救方法很好,但是充满危险。请允许我做一些解释。

在该专栏中,我提到过的代码如下所示:

if (A + B > MAX) return -1;

应该改成这样:

if (A + B >= A && A + B < MAX) {
   // cool!
}

三年前就有人指出,一些人会看到这段代码,但是不知道它有什么用,从而可能删除 A+B >= A 部分,因为它看起来纯属多余,而现在,整数溢出又重新出现在您面前。不会吧!

作为回应,我写了下面的头文件,它的意图再明白不过了。是的,它看起来像乱码,但这段乱码却是 x86 汇编语言。我之所以使用汇编语言,是因为它可以使我直接访问 jc 操作数,即按进位转移 (jump-on-carry)。换句话说,它检测数学运算是否会导致溢出。

#ifndef _INC_INTOVERFLOW_
#define _INC_INTOVERFLOW_

#ifdef _X86_

inline bool UAdd(size_t a, size_t b, size_t *r) {

   __asm {
      mov         eax,dword ptr [a] 
      add         eax,dword ptr [b] 
      mov         ecx,dword ptr [r] 
      mov         dword ptr [ecx],eax 
      jc         short j1
      mov         al,1 
      jmp         short j2
j1:

#ifdef _DEBUG
      int         3
#endif
      xor         al,al
j2:
   };
}

inline bool UMul(size_t a, size_t b, size_t *r) {

   __asm {
      mov         eax,dword ptr [a] 
      mul         dword ptr [b] 
      mov         ecx,dword ptr [r] 
      mov         dword ptr [ecx],eax 
      jc         short j1
      mov         al,1 
      jmp         short j2
j1:

#ifdef _DEBUG
      int         3
#endif
      xor         al,al
j2:
   };
}

inline bool UMulAdd(size_t mul1, size_t mul2, size_t add, size_t *r) {

   size_t t = 0;
   if (UMul(mul1,mul2,&t))
      return UAdd(t,add,r);
   return false;
}

#else
#   error "This code compiles only on 32-bit x86
#endif // _X86_

#endif // _INC_INTOVERFLOW_

请查看这个文件,它包括解释这些函数的简单文档。

发现安全漏洞

虽然花了一点时间,但是许多人都找到了漏洞。当通过比较字符串来做出安全决策时,这种比较就应该是区域性不变的比较或字节方式的比较。在这个例子中,我编写的代码可能允许访问土耳其语的敏感数据,因为在土耳其语中,字母“I”有四个实例,两个小写字母,两个大写字母。您可以在 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemstringclasscomparetopic5.asp 上阅读这方面的内容。

现在,让我们转到本月的错误。这段代码有什么问题?

void func(char *p) {
   char buf[10+1];
   memset(buf,0,sizeof(buf));
   
   // limit string to 10 chars
   sprintf(buf,"%10s",p);
   printf("Hello, %s/n",buf);
}

一个小智力游戏

这个智力游戏实际上与安全性毫无关系,但是当我想到人们为整数溢出检测代码所困扰时,我就把它从我记忆的深处拉了出来。这段代码有什么用呢?

int a = 0x42;
int b = 0x69;
a ^= b;
b ^= a;
a ^= b;

这个游戏的规则非常简单,您无法编译或解释这段代码。试着仅仅通过观察来确定它有什么用。

从零到CVE:实战漏洞挖掘的系统化成长路线图 软件安全漏洞是计算机系统中因设计或实现缺陷导致的安全弱点,其本质源于程序与系统交互时对数据边界的失控。理解漏洞原理需要掌握内存管理、程序执行流等底层机制,这构成了漏洞挖掘的技术基础。从技术价值看,漏洞研究不仅关乎攻击与防御的对抗,更是提升软件质量、推动安全开发流程的关键实践。在应用场景上,无论是企业安全审计、渗透测试还是开源软件维护,系统化的漏洞挖掘能力都至关重要。本文围绕CVE漏洞复现与实战挖掘,提供了一套从基础原理到高级狩猎的渐进式学习框架,特别针对CVE编号申请流程和项目中CVE管理策略给出了具体指引 阅读详情

相关推荐

杀毒软件DoS漏洞:从模糊测试到防御实践

拒绝服务攻击通过耗尽目标系统资源使其无法提供正常服务,是网络安全领域的常见威胁。其原理在于利用程序在处理输入时的资源管理缺陷,如内存分配异常或无限循环。这类漏洞的技术价值在于揭示了安全软件自身健壮性的重要性,尤其在复杂文件解析、实时监控等场景中。应用场景广泛,从文件格式解析到网络协议处理都可能成为攻击面。本文聚焦于杀毒软件中的DoS漏洞,通过模糊测试等实践方法,探讨如何发现和利用这类漏洞,并提供了针对性的防御建议,帮助提升安全产品的抗攻击能力。

weixin_33804582的博客 443

整数溢出,如何判断整数溢出

c语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果

David的专栏 2万+

SQL注入防御实战:五层防护盾构建Web应用安全防线

SQL注入作为Web安全领域的经典威胁,其核心原理在于攻击者通过构造恶意输入,篡改后端数据库查询逻辑,从而绕过认证、窃取数据甚至控制服务器。理解其运作机制是构建有效防御的基础。在工程实践中,参数化查询(预编译语句)是抵御SQL注入最根本的技术手段,它通过分离代码与数据,确保用户输入始终被当作数据处理。结合输入验证、最小权限原则、Web应用防火墙(WAF)及安全编码规范,形成纵深防御体系,能显著提升应用安全性。本文聚焦于SQL注入的实战防护,通过多层防护策略,为开发者提供从代码到架构的完整安全解决方案。

weixin_30561177的博客 429

嵌入式软件可靠性设计的一些理解

0.前言           设备的可靠性涉及多个方面:稳定的硬件、优秀的软件架构、严格的测试以及市场和时间的检验等等。这里着重谈一下作者自己对嵌入式软件可靠性设计的一些理解,通过一定的技巧和方法提高软件可靠性。这里所说的嵌入式设备,是指使用单片机、ARM7、Cortex-M0,M3之类为核心的测控或工控系统。        嵌入式软件可靠性设计应该从防错、判错和容错三方面进行考虑. 此外

朱工的专栏 1万+

2024年SRC漏洞挖掘实战指南:从信息收集到逻辑漏洞的精细化狩猎

在网络安全领域,漏洞挖掘是评估系统安全性的核心实践,其本质在于通过模拟攻击者行为,发现软件或系统中存在的设计缺陷与安全弱点。其技术原理通常围绕输入验证、权限控制、业务逻辑等环节展开,通过构造异常数据或非预期操作流程,探测系统的异常响应。掌握漏洞挖掘技术对于提升系统防御能力、构建主动安全体系具有重要价值,广泛应用于渗透测试、红蓝对抗、安全众测等场景。本文聚焦于SRC实战,深入剖析了信息收集、工具链配置等基础环节,并重点探讨了逻辑漏洞与SQL注入等经典攻击面的现代挖掘技巧,旨在为安全研究人员提供一套可复现的精细

weixin_30755393的博客 440

AI落地核心:任务拆解、能力对齐与人机分工

大模型应用的本质不是选择更强的AI,而是建立人与智能工具之间的可靠协作机制。从基础概念看,AI是具备模式识别与自动化执行能力的增强型协作者;其技术原理在于将模糊业务目标转化为结构化、可验证、可审计的任务契约;核心价值在于提升确定性环节的执行效率与一致性,降低人为误差和重复劳动成本;典型应用场景覆盖运营提效(如销售日报生成)、专业服务辅助(如合同条款校验)、流程自动化(如采购审批核验)等高频、高规则性工作流;而真正决定成败的关键,正是对‘任务拆解’‘能力对齐’‘人机分工’三大实践原则的系统性贯彻。

weixin_30781107的博客 386

一种被忽视的构造和整数溢出重现 (转)

发布日期: 7/30/2004 | 更新日期: 7/30/2004Michael HowardSecure Windows Initiative摘要:Michael Howard 研究了一种常常被忽略的代码构造,这种构造可能会导致严重的缓冲区溢出问题,然后介绍了一种在没有溢出副作用的情况下执行算术运算的替代方法。谈谈构造很奇怪,有如此之多的安全指导文档提示人们注意危险的

Kevin'Blog 1084

增量性测量:破解营销归因幻觉的因果推断方法论

增量性是数字营销中衡量真实因果效应的核心概念,它基于反事实框架,通过对比实验组与对照组的差异,剥离自然增长、季节波动和多渠道干扰,精准识别干预带来的净增价值。其技术原理根植于随机对照试验(RCT)、双重差分(DID)等因果推断方法,强调可解释性、统计功效与业务口径对齐,而非单纯追求模型精度。在电商、SaaS、金融等行业,增量性已超越归因工具,成为预算决策、产品迭代与定价策略的底层评估标准。本文聚焦Ab Testing实践中的关键卡点与避坑指南,系统拆解从实验设计、分流逻辑、周期设定到结果解读的全链路工程化落

476

MATLAB规划建模七参数构造法:从题目到可运行代码

线性规划与非线性优化是运筹学和工程优化的核心基础,其本质是将现实决策问题转化为数学模型并求解。MATLAB作为主流数值计算平台,通过linprog、intlinprog、fmincon等求解器实现高效求解,但关键瓶颈不在理论理解,而在模型到代码的‘构造’过程——即目标函数系数f、约束矩阵A/b与Aeq/beq、变量边界lb/ub等七个输入参数的准确生成与维度匹配。本文聚焦MATLAB规划建模的工程落地环节,系统解析参数物理含义、常见维度陷阱、整数与非线性场景差异,并结合国赛、美赛真题,提供变量提取表、约束分

weixin_33806300的博客 620

[华为ensp]双核心的园区网

(给部分只会emm......借鉴的朋友提个醒,在group-member e0/0/2 to e0/0/20是所选,所以到了p l t那会给2-20端口都配置上trunk,别紧张,不是你问题)完成上述配置后,PC1可以ping通HTTP2服务器,Client1可以访问HTTP2服务器的HTTP站点,如果不能就要检查上述是否正确。本次实验主要目的是采用双核心的冗余网络,采用MSTP和VRRP技术,在核心层交换机上配置SC1上配置OSPF协议。SC1交换机上配置VRRP。在SC1上配置DHCP。

2301_78859499的博客 1416

【MUJOCO控制篇-2】控制一个简单的机械臂

本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。

echo_Fangyb的博客 6748

IT文档 7

 “打开”对话框同时选择多个文件“扫雷”游戏的幕后一个利用随机数加密字串的算法一个图片数据的存和取的示例一个很COOL的对话框弹出效果一个新奇和笨拙的VB屏保一个旋转的3D箱子(动画)一个用VBA编写的Melissa病毒一个绝对经典的在VB中操作.ini文件的通用类源代码一个群发邮件的DELPHI代码一种简便有效的数据库安全法一种被忽视的构造和整数溢出重现上楼梯算法的java实现下载和上载远程视图

iamhere1956的专栏 479

手把手教你配置UEFI Secure Boot:从密钥生成到系统验证(附避坑指南)

本文详细介绍了如何配置UEFI Secure Boot,从密钥生成到系统验证的全过程,包括PK、KEK等关键密钥的生成方法,以及常见问题的解决方案。通过实战案例和避坑指南,帮助用户有效提升系统启动安全性,防止恶意软件植入。

weixin_30776273的博客 343

Mythos如何重塑AI安全能力边界与产业格局

大模型在网络安全领域的应用正从‘辅助分析’迈向‘自主攻防’新阶段。其核心在于对漏洞本质的理解能力、多阶段深度推理机制,以及与真实攻防场景的强耦合性。随着Mythos等新一代AI安全模型在SWE-bench Pro、CyberGym等硬指标上实现断层式跃升,模型已能独立完成资产测绘、代码审计、POC生成到EXP构造的全链路操作。这种能力不仅重构了漏洞发现效率,更倒逼企业构建AI原生安全架构——将大模型深度集成至DevSecOps流水线,并通过人机协同决策中枢实现风险可控的自动化响应。Mythos代表的并非单一

bangtuo9862的博客 336

Class AB OPA STB仿真相位异常:从corner case到碰撞电离的排查与规避

本文深入分析了Class AB运算放大器(OPA)在STB稳定性仿真中,特定工艺角(corner case)下出现相位从0°开始的异常现象。排查发现,其根本原因在于高Vds引发的碰撞电离效应,通过衬底和电源网络引入了隐藏的正反馈通路。文章对比了修改衬底连接与优化电路降低Vds两种解决方案,并基于工程实践推荐了代价更小、兼容性更好的电路优化方案,成功规避了问题并完成流片验证。

grape的博客 636

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 540

遗传算法工业实操指南:从编码建模到收敛调试

遗传算法(GA)是一种面向不可导、非连续、黑箱优化问题的进化计算方法,其核心在于将业务约束转化为可计算的编码规则与适应度函数。原理上,它通过选择、交叉、变异等算子在解空间中进行概率化搜索,关键不在于模拟生物过程,而在于工程化控制探索与开发的平衡。技术价值体现在对梯度缺失场景的天然适配、离散/混合变量的直接支持,以及强约束条件下的可行性保障。典型应用场景包括智能排产、路径规划、参数调优和实时温控策略生成。本文聚焦GA落地中最易踩坑的四大环节:问题建模中的约束内化、锦标赛选择替代轮盘赌、SBX交叉与自适应变异、

weixin_30940783的博客 424

【A2DP】规范精讲[1]: 深入解析A2DP协议的核心架构

在蓝牙技术发展的早期阶段,音频传输主要通过SCO(同步面向连接)链路实现,这种设计主要针对语音通信,音质有限且功能单一。随着人们对无线高质量音频需求的增长,​​Advanced Audio Distribution Profile (A2DP)​​ 应运而生,成为蓝牙音频传输的技术基石。

byte轻骑兵的技术小窝 1万+

Mythos模型:AI驱动的零日漏洞发现与对齐风险实战指南

大语言模型正从通用对话工具演进为具备深度系统理解与自主推理能力的安全专家。以Mythos为代表的新型AI模型,依托长程因果推理、符号执行融合模糊测试等核心技术,实现了从‘概率性猜测’到‘确定性证明’的零日漏洞发现跃迁。其技术价值不仅在于提升SWE-bench Pro等基准分数,更在于将传统需数周完成的代码审计压缩至小时级,并输出可验证PoC。典型应用场景覆盖金融核心系统、医疗PACS平台及开源基础设施的防御性安全评估。本文聚焦Mythos在真实攻防环境中的能力边界、沙箱部署规范与提示工程实践,深入解析Gat

chaoyv 339

HINT: High-quality INpainting Transformer with Mask-Aware Encoding and Enhanced Attention 训练自己的数据集

HINT(高质量图像修复变换器)通过创新的掩码感知像素洗牌下采样模块(MPD)和空间激活通道注意力层(SCAL),显著提高了图像修复的质量,尤其在大面积缺失区域的情况下。实验表明,HINT在CelebA、CelebA-HQ、Places2和敦煌数据集上超越了现有的最先进模型,提升了图像的细节和结构一致性。

LJ1147517021的博客 312

100天精通Python(爬虫篇)——第114天:爬虫基础模块之requests基础入门

一、request模块大总结 1. 下载安装 2. 常用属性或方法 3. response.text和response.content的区别: 4. 发送带headers参数请求 5. 发送带参数请求 6. 在headers参数中携带cookie 7. 超时参数timeout的使用 8. proxies代理参数的使用 9. 发送post请求...............

努力让自己发光,对的人才能迎着光而来 11万+
上一篇: 修复缓冲区溢出
下一篇: C语言中常见错误 
bmsdr
博客等级 码龄22年 11粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值