首页 > 编程语言 >汇编语言简易教程(13):栈缓存溢出

汇编语言简易教程(13):栈缓存溢出

时间:2024-04-14 14:36:02浏览次数:23  
标签:13 缓存 函数 汇编语言 程序 寄存器 堆栈 溢出

汇编语言简易教程(13):栈缓存溢出

当程序溢出基于堆栈的动态变量时,可能会发生堆栈缓冲区溢出。 例如,如果一个程序分配并使用一个基于堆栈的本地数组,该数组包含 50 个元素,并且数组中存储了 50 个以上的元素,则会发生溢出。 这种溢出通常是坏的,通常会导致程序错误,甚至可能使程序崩溃。

堆栈将包含其他重要信息,例如其他变量、保留的寄存器、帧指针、返回地址和/或基于堆栈的参数。 如果此类数据被覆盖,则可能会导致难以调试的问题,因为症状可能与问题实际发生的位置无关.

什么是栈缓存溢出

什么是栈缓存溢出

当程序调用函数时,标准调用约定为如何传递参数、如何保存返回地址、如何保留寄存器以及必须保留哪些寄存器以及如何分配基于堆栈的局部变量提供了指导

例如: expFunc(arg1, arg2, arg3)

此外,我们将假设函数 expFunc() 从用户那里读取一行文本并将其存储在本地声明的数组中。 局部变量包括 48 字节的数组和一个四字局部变量(8 字节)。 这可以用高级语言轻松完成,也可以像“系统服务”, 控制台输入中那样完成.

image

栈帧分布如上.

当函数完成时,调用帧的所有元素都会被移除。保存的寄存器会恢复到它们原来的内容,局部变量会被移除,返回地址会从栈中复制出来并放入rip寄存器中,这会导致跳回到原始的调用例程。如第12章“函数”所述,这种布局支持多级函数调用,包括递归。

在第13章的示例中,读取用户输入的字符并将它们输入到数组中时,明确检查了字符计数以确保计数不会超过缓冲区大小。很容易忘记执行这个重要的检查。确实,一些C函数,如strcpy(),不执行尺寸验证,因此被认为是不安全的,或被描述为一个不安全的函数。

在这个例子中,覆写48字符的缓冲区将破坏栈的内容,这个栈包含了rbp寄存器的原始值,可能还包括rip寄存器。如果rip寄存器的原始值的栈内容以任何方式被修改或损坏,函数将无法返回到调用例程,并会尝试跳转到某个随机位置。如果随机位置在程序范围之外,这是很可能的,程序将生成一个段错误(即“段错误”或程序崩溃)。

调试这种类型的错误可能是一个重大挑战。错误出现在函数的最后(在返回时)。问题实际上出现在函数的主体中,事实上可能是由于没有包括的代码(与存在的错误代码相对)。

测试程序是否存在这种漏洞将涉及在提示输入时输入远远超出预期的字符。例如,如果提示输入名称,输入200个字符(可能是通过按住一个键),程序崩溃将是这种漏洞存在的迹象。错误消息将表明这种漏洞不存在。虽然直接,但这种类型的测试经常没有被彻底检查,甚至完全被省略。

标签:13,缓存,函数,汇编语言,程序,寄存器,堆栈,溢出
From: https://www.cnblogs.com/pDJJq/p/18134103/simple-tutorial-of-assembly-language-13-stack-cac

相关文章

  • 汇编语言简易教程(14):中断与恢复
    汇编语言简易教程(14):中断与恢复从一般意义上讲,中断是工作流的暂停或保持。例如,如果您正在打电话,门铃响了,则电话通话将处于暂停状态,门将应答。销售人员被送走后,电话交谈恢复(对话中断的地方)在计算机编程中,中断也是当前正在执行的过程的暂停或保持。通常,当前进程会中断,以便可......
  • 汇编语言简易教程(15):End
    汇编语言简易教程(15):End写到这里,就告一段落了.前面的内容写起来还是比较认真的,到后面的系统调用,栈缓存,中断这些内容已经快要昏迷过去了但是我认为这篇教程能够达到预期的目标:对于汇编代码的基本阅读了解汇编的基本机制我强烈建议各位有时间能够去阅读原书,难......
  • 汇编语言简易教程(13):栈缓存溢出
    汇编语言简易教程(13):栈缓存溢出当程序溢出基于堆栈的动态变量时,可能会发生堆栈缓冲区溢出。例如,如果一个程序分配并使用一个基于堆栈的本地数组,该数组包含50个元素,并且数组中存储了50个以上的元素,则会发生溢出。这种溢出通常是坏的,通常会导致程序错误,甚至可能使程序崩溃......
  • [题解]P3413 萌数
    P3413萌数先打出暴搜代码,参数有\(pos,limit,hui\),其中bool类型的\(hui\)表示到当前是否有回文。暴搜代码中加入了一个剪枝:if(!limit&&hui)returnpow10[pos];,这个!limit很重要,我就是因为这个没加,暴搜代码都调了半天。然后就是if(pos==0)returnhui;。我们还需要记录下填过的......
  • FFmpeg开发笔记(十四)FFmpeg音频重采样的缓存
    ​FFmpeg在很多地方都运用了缓存机制,比如《FFmpeg开发实战:从零基础到短视频上线》一书的“3.3.2 对视频流重新编码”介绍了编解码的数据缓存,不单是视频编码过程和视频解码过程有缓存,甚至连音频重采样都用到了缓存。也就是说,重采样函数swr_convert一次只会输出指定长度的音频数......
  • 《自动机理论、语言和计算导论》阅读笔记:p139-p171
    《自动机理论、语言和计算导论》学习第7天,p139-p171总结,总计33页。一、技术总结1.reversalp139,Thereversalofastringa1a2...anisthestringwrittenbackwards,thatisanan-1...a1.2.homomorphismAstringhomomorphismisafunctiononstringsthatwokrs......
  • 2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts
    2024-04-13:用go语言,给定一个整数数组nums,请编写一个函数,返回一个新的数组counts。满足以下条件:对于每个nums[i],counts[i]表示在nums[i]右侧且比nums[i]小的元素数量。输入:nums=[5,2,6,1]。输出:[2,1,1,0]。答案2024-04-13:来自左程云。灵捷3.5大体过程如下:给定......
  • 2024.4.13 模拟赛总结
    坑点总结:1.关于数据顺序模拟赛T1题面清明节,又称祭祖节,在每年4月4日至6日之间,是祭祀、祭祖和扫墓的节日。小明的爸爸妈妈决定清明假期带着他回老家扫墓。小明的爸爸一共要开车行驶1000千米才能到家,现在沿途有N个旅馆,为了安全起见,每天晚上都不开车,住在旅馆里(晚上不可以......
  • 24/04/13 CF494C Helping People / HDU5866 Lucky E
    CF494C:题面翻译有一个长为\(n\)的数列,初始时为\(a_{1..n}\)。给你\(q\)个操作,第\(i\)个操作将\([l_i,r_i]\)内的数全部加一,有\(p_i\)的概率被执行。保证区间不会交错,即:\(\foralli,j\in[1,q],l_i\ler_i<l_j\ler_j\)或\(l_i\lel_j\ler_j\ler_i\)或\(l_j\le......
  • 4.13 闲话
    TopCoder13696Morphling前置知识:泰勒展开,符号化方法,无标号无根树计数我们考虑我们目前序列为\(a\),然后从每个\(i\toa_i\)连边,得到一颗基环树。我们考虑一次\((x,y)\)的影响,原本连向\(x\)的边连向了\(y\),原本连向\(y\)的边连向了\(x\),而\(x,y\)连向的边互换了,我......