软件漏洞分析入门_3_初级栈溢出B_系统栈原理

函数的调用堆栈 在学习c++的过程中,有面向过程和面向对象两种编程方式。对于面向过程来说,函数的书写是最基本的,所以了解函数的调用过程和函数调用的底层原理也是必须要会的事情。 那么函数栈帧的开辟和回退是怎么进行的呢? 下面我们先用一个简单的例子,通过一个模拟模型和反汇编来了解一下函数堆栈的调用。   题外话:   1、说到汇编我们要知道,汇编的代码分为两种: 一种是inter的x86汇编(从右向左看 阅读详情
第3讲  初级栈溢出B

To be the apostrophe which changed “Impossible” into “I’m possible”
—— failwest

小荷才露尖尖角

扫盲班第三讲开课啦!
上节课我们用越过数组边界的一个字节把邻接的标志变量修改成0,从而突破了密码验证程序。您实验成功了吗?没有的话回去做完实验在来听今天的课!

有几个同学反映编译器的问题,我还是建议用VC6.0,因为它build出来的PE最适合初学者领会概念。而且这门课动手很重要,基本上我的实验指导都是按VC6.0来写的,用别的build出来要是有点出入,实验不成功的话会损失学习积极性滴——实验获得的成就感是学习最好的动力。

另外在回帖中已经看到不少同学问了一些不错的问题:
如果变量之间没有相邻怎么办?
如果有一个编译器楞要把authenticated变量放在buffer[8]数组前边咋办?

今天的课程将部分回答这些问题。

今天基本没有程序和调试(下一讲将重新回归实践),主要是一些理论知识的补充。听课的对象是只用C语言编过水仙花数的同学。如果你不是这样的同学,可以飘过本讲,否则你会说我罗嗦滴像唐僧~~~~我的目标就是一定要让你弄明白,不管多罗嗦,多俗气,多傻瓜的方法,呵呵

找工作滴同学也可以看看这部分,很可能会对面试有帮助呦。根据我个人无数次的面试经验,会有很多考官饶有兴趣的问你学校课本上从来不讲的东东,比如堆和栈的区别,什么样的变量在栈里,函数调用是怎么实现的,参数入栈顺序,函数调用时参数的值传递、地址传递的原理之类。学完本节内容,您将对高级语言的执行原理有一个比较深入的认识。

此外,这节课会对后面将反复用到的一些寄存器,指令进行扫盲。不要怕,就几个,保管你能弄懂。

最后,上次提意见说图少的同学注意了,这节课的配套图示那叫一个多啊。

所以还是那句话,不许不学,不许学不会,不许说难,呵呵

我们开始吧!

  根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下四个部分:

代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域来取指并执行。
数据区:用于存储全局变量等。
堆区:进程可以在堆区动态的请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点
栈区:用于动态的存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行

     注意:这种简单的内存划分方式是为了让您能够更容易地理解程序的运行机制。《深入理解计算机系统》一书中有更详细的关于内存使用的论述,如果您对这部分知识有兴趣,可以参考之 

  在windows平台下,高级语言写出的程序经过编译链接,最终会变成各位同学最熟悉不过的PE文件。当PE文件被装载运行后,就成了所谓的进程。

 名称:  01.JPG
查看次数: 1958
文件大小:  39.1 KB
图1

                      
  如果把计算机看成一个有条不紊的工厂的话,那么可以简单的看成是这样组织起来的:

CPU是完成工作的工人;
数据区,堆区,栈区等则是用来存放原料,半成品,成品等各种东西的场所;
存在代码区的指令则告诉CPU要做什么,怎么做,到哪里去领原材料,用什么工具来做,做完以后把成品放到哪个货舱去;
值得一提的是,栈除了扮演存放原料,半成品的仓库之外,它还是车间调度主任的办公室。
  
  程序中所使用的缓冲区可以是堆区、栈区、甚至存放静态变量的数据区。缓冲区溢出的利用方法和缓冲区到底属于上面哪个内存区域密不可分,本讲座主要介绍在系统栈中发生溢出的情形。堆中的溢出稍微复杂点,我会考虑在中级班中给予介绍

  以下内容针对正常情况下的大学本科二年级计算机水平或者计算机二级水平的读者,明白栈的飘过即可。

  从计算机科学的角度来看,栈指的是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:压栈(PUSH),弹栈(POP);用于标识栈的属性也有两个:栈顶(TOP),栈底(BASE)

  可以把栈想象成一摞扑克牌:

  PUSH:为栈增加一个元素的操作叫做PUSH,相当于给这摞扑克牌的最上面再放上一张;
  POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一张;

  TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH操作,它都会自增1;相反每做一次POP操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有这张牌的花色是当前可以看到的。
  BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE用于防止栈空后继续弹栈,(牌发完时就不能再去揭牌了)。很明显,一般情况下BASE是不会变动的。

  内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似C语言这样的高级语言,系统栈的PUSH,POP等堆栈平衡细节是透明的。一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。

  注意:系统栈在其他文献中可能曾被叫做运行栈,调用栈等。如果不加特别说明,我们这里说的栈都是指系统栈这个概念,请您注意与求解“八皇后”问题时在自己在程序中实现的数据结构区分开来。


  我们下面就来探究一下高级语言中函数的调用和递归等性质是怎样通过系统栈巧妙实现的。请看如下代码:

int  func_B(int arg_B1, int arg_B2)
{
  int var_B1, var_B2;
  var_B1=arg_B1+arg_B2;
  var_B2=arg_B1-arg_B2;
  return var_B1*var_B2;
}

int  func_A(int arg_A1, int arg_A2)
{
  int var_A;
  var_A = func_B(arg_A1,arg_A2) + arg_A1 ;
  return var_A;
}

int main(int argc, char **argv, char **envp)
{
  int var_main;
  var_main=func_A(4,3);
  return var_main;
}

  这段代码经过编译器编译后,各个函数对应的机器指令在代码区中可能是这样分布的:


名称:  02.JPG
查看次数: 1958
文件大小:  17.4 KB 
图2


  根据操作系统的不同、编译器和编译选项的不同,同一文件不同函数的代码在内存代码区中的分布可能相邻也可能相离甚远;可能先后有序也可能无序;但他们都在同一个PE文件的代码所映射的一个“区”里。这里可以简单的把它们在内存代码区中的分布位置理解成是散乱无关的。

  当CPU在执行调用func_A函数的时候,会从代码区中main函数对应的机器指令的区域跳转到func_A函数对应的机器指令区域,在那里取指并执行;当func_A函数执行完闭,需要返回的时候,又会跳回到main函数对应的指令区域,紧接着调用func_A后面的指令继续执行main函数的代码。在这个过程中,CPU的取指轨迹如下图所示:
  
 

名称:  03.JPG
查看次数: 1934
文件大小:  28.6 KB
图3


  那么CPU是怎么知道要去func_A的代码区取指,在执行完func_A后又是怎么知道跳回到main函数(而不是func_B的代码区)的呢?这些跳转地址我们在C语言中并没有直接说明,CPU是从哪里获得这些函数的调用及返回的信息的呢?

  原来,这些代码区中精确的跳转都是在与系统栈巧妙地配合过程中完成的。当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。这个栈帧中的内存空间被它所属的函数独占,正常情况下是不会和别的函数共享的。当函数返回时,系统栈会弹出该函数所对应的栈帧。

名称:  04.JPG
查看次数: 1925
文件大小:  107.3 KB
图4

  
  如图所示,在函数调用的过程中,伴随的系统栈中的操作如下:

  在main函数调用func_A的时候,首先在自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈
  在func_A调用func_B的时候,同样先在自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈
  在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址重新跳到func_A代码区中执行
  在func_A返回时,func_A的栈帧被弹出系统栈,main函数栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址跳到main函数代码区中执行

  注意:在实际运行中,main函数并不是第一个被调用的函数,程序被装入内存前还有一些其他操作,上图只是栈在函数调用过程中所起作用的示意图


  每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。WIN32系统提供两个特殊的寄存器用于标识位于系统栈栈顶的栈帧:

  ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶
  EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部


  寄存器对栈帧的标识作用如下图所示:


名称:  05.JPG
查看次数: 1898
文件大小:  61.7 KB 
图5



  函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。
  
  在函数栈帧中一般包含以下几类重要信息:

  局部变量:为函数局部变量开辟内存空间。
  栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过堆栈平衡计算得到),用于在本帧被弹出后,恢复出上一个栈帧。
  函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便函数返回时能够恢复到函数被调用前的代码区中继续执行指令。


  注意:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。在以后几讲的调试实验中您会发现,函数运行过程中,其栈帧大小也是在不停变化的。


  除了与栈相关的寄存器外,您还需要记住另一个至关重要的寄存器:

  EIP:指令寄存器(extended instruction pointer), 其内存放着一个指针,该指针永远指向下一条待执行的指令地址



名称:  06.JPG
查看次数: 1887
文件大小:  20.3 KB 
图6


  可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。下面的讲座我们就会逐步介绍如何控制EIP,劫持进程的原理及实验。


函数调用约定与相关指令
  

函数调用约定描述了函数传递参数方式和栈协同工作的技术细节。不同的操作系统、不同的语言、不同的编译器在实现函数调用时的原理虽然基本类同,但具体的调用约定还是有差别的。这包括参数传递方式,参数入栈顺序是从右向左还是从左向右,函数返回时恢复堆栈平衡的操作在子函数中进行还是在母函数中进行。下面列出了几种调用方式之间的差异。

                              C          SysCall  StdCall  BASIC  FORTRAN  PASCAL
参数入栈顺序                  右->左  右->左  右->左  左->右  左->右  左->右
恢复栈平衡操作的位置  母函数  子函数  子函数  子函数  子函数  子函数


  具体的,对于Visual C++来说可支持以下三种函数调用约定
调用约定的声明  参数入栈顺序  恢复栈平衡的位置
__cdecl  右->左  母函数
__fastcall  右->左  子函数
__stdcall  右->左  子函数

  要明确使用某一种调用约定的话只需要在函数前加上调用约定的声明就行,否则默认情况下VC会使用__stdcall的调用方式。本篇中所讨论的技术,在不加额外说明的情况下,都是指这种默认的__stdcall调用方式。

  除了上边的参数入栈方向和恢复栈平衡操作位置的不同之外,参数传递有时也会有所不同。例如每一个C++类成员函数都有一个this指针,在windows平台中这个指针一般是用ECX寄存器来传递的,但如果用GCC编译器编译的话,这个指针会做为最后一个参数压入栈中。

  同一段代码用不同的编译选项、不同的编译器编译链接后,得到的可执行文件会有很多不同。

  函数调用大致包括以下几个步骤:

  参数入栈:将参数从右向左依次压入系统栈中
  返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
  代码区跳转:处理器从当前代码区跳转到被调用函数的入口处
  栈帧调整:具体包括
  保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)
  将当前栈帧切换到新栈帧。(将ESP值装入EBP,更新栈帧底部)
  给新栈帧分配空间。(把ESP减去所需空间的大小,抬高栈顶)
  
  对于__stdcall调用约定,函数调用时用到的指令序列大致如下:

  ;调用前
push 参数3    ; 假设该函数有3个参数,将从右向左依次入栈
push 参数2    
push 参数1    
call 函数地址  ; call指令将同时完成两项工作:a)向栈中压入当前指令在内存中的位置,          ; 即保存返回地址;b)跳转到所调用函数的入口地址

  ;函数入口处
push ebp      ; 保存旧栈帧的底部
mov ebp,esp    ; 设置新栈帧的底部(栈帧切换)
sub esp,xxx    ; 设置新栈帧的顶部(抬高栈顶,为新栈帧开辟空间)

上面这段用于函数调用的指令在栈中引起的变化如下图所示:

名称:  07.JPG
查看次数: 1898
文件大小:  49.2 KB
  
此图已经缩小,点击察看原图。


注意:关于栈帧的划分不同参考书中有不同的约定。有的参考文献中把返回地址和前栈帧EBP值做为一个栈帧的顶部元素,而有的则将其做为栈帧的底部进行划分。在后面的调试中,您会发现OllyDbg在栈区标示出的栈帧是按照前栈帧EBP值进行分界的,也就是说前栈帧EBP值即属于上一个栈帧,也属于下一个栈帧,这样划分栈帧后返回地址就成为了栈帧顶部的数据。我们这里将坚持按照EBP与ESP之间的位置做为一个栈帧的原则进行划分。这样划分出的栈帧如上面最后一幅图所示,栈帧的底部存放着前栈帧EBP,栈帧的顶部存放着返回地址。划分栈帧只是为了更清晰的了解系统栈的运作过程,并不会影响它实际的工作。

  类似的,函数返回的步骤如下:

  保存返回值:通常将函数的返回值保存在寄存器EAX中
  弹出当前栈帧,恢复上一个栈帧:
  具体包括
  在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间
  将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧
  将函数返回地址弹给EIP寄存器
  跳转:按照函数返回地址跳回母函数中继续执行

  还是以C语言和WIN32平台为例,函数返回时的相关的指令序列如下:  

  
add xxx, esp  ;降低栈顶,回收当前的栈帧
pop ebp    ;将上一个栈帧底部位置恢复到ebp,
retn      ;这条指令有两个功能:a)弹出当前栈顶元素,即弹出栈帧中的返回地址。至此        ;栈帧恢复工作完成。b)让处理器跳转到弹出的返回地址,恢复调用前的代码区


  按照这样的函数调用约定组织起来的系统栈结构如下:


 名称:  09.JPG
查看次数: 1881
文件大小:  53.2 KB



喂!醒醒!说你呐!还睡!呵呵

不要怪我罗嗦,要彻底的掌握,真正的掌握,完全的掌握缓冲区溢出攻击,这些知识是必须的!讲到这里,如果你思维够敏捷的话,应该已经可以看出我不是无中生有的花这么多篇幅来浪费版面的。

回忆上一讲的那个例子,buffer后面是authenticated变量,authenticated变量后面是谁呢?就是我废了好多口水讲到的当前的正在执行的函数对应的栈帧变量EBP与EIP(函数返回地址)的值!

verify_password函数返回之后,程序就会按照这个返回地址(EIP)所指示的内存地址去取指令并执行。

如果我们在多给几个输入的字符,让输入的数据跃过authenticated变量,一直淹没到返回地址的位置,把它淹没成我们想要执行的指令的内存地址,那么verify_password 函数返回后,就会乖乖滴去执行我们想让它执行的东东了(例如直接返回到密码正确的处理流程)。


哎呀,拖堂了,我平生最恨拖堂滴老师,今天就到这里吧。

下节课我会带着大家一步一步的完成这节课的分析,让跃过数组的字符串继续跃过authenticated变量,直到把函数返回地址修改成我们想要的值,从而改变程序流程。
 
函数调用与栈 文章目录函数调用与栈内存栈调用函数前调用函数时关于寄存器%ebp栈帧函数调用将要结束时函数调用结束后注 函数调用与栈 内存栈   在C语言中函数的调用必须借助于栈。   关于栈是什么就不再做笔记了,但需要注意的是,这里的栈与数据结构中的栈虽然原理相同但并不是一个东西。在这里,栈就是一段计算机内存,只不过这段内存满足数据后进先出的规则。   另外还需要注意的是,内存栈是向下增长的,即栈顶在下、栈底在... 阅读详情

相关推荐

【74HC595芯片】核心驱动代码

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

weixin_67147824的博客 1847

系统栈的工作原理

1.开篇   本篇文章着重写的是系统中栈的工作原理,以及函数调用过程中栈帧的产生与释放的过程,有可能名字过大,如果不合适我可以换一个名字,希望大家能够指正,小丁虚心求教!如果有哪里写的不清楚的或者错误的地方请及时更正,小丁再次谢过了。文章里面有错别字,也可能会有好友说寄存器的32、16位的区别其实我感觉这里主要讲的还是些原理性的东西,后续会将文章图片错别字进行调整.(图片里面的posh改为p...

weixin_30949361的博客 1240

海康威视工业相机网络配置实战:从MVS软件操作到IP地址规划

本文详细介绍了海康威视工业相机的网络配置实战,从MVS软件操作到IP地址规划。重点讲解了IP设置的重要性、Windows系统下的网络配置步骤、避免IP冲突的技巧,以及MVS软件中的相机IP配置方法。帮助用户快速掌握工业相机的网络连接技术,确保稳定高效的图像采集。

weixin_30296405的博客 485

C++运行栈与函数调用的执行

1、运行栈工作原理C++变量在运行时依靠地址加以区分。变量的定义全部写在函数以外,这样的变量叫做全局变量。变量的定义放在一个函数之内,这样的变量叫做局部变量。全局变量,在目标代码中都是用一个唯一确定的地址定位的。然而,对于全局变量却不能如此,这是因为:(1)局部变量只在调用它所在的函数时才会生效,一旦函数返回后就会失效。很多局部变量的生存周期远小于整个程序的运行周期,如果为每个局部变量分配不同的空...

跟着BOSS有肉吃 3273

《工程测量学》笔记/期末复习资料

《工程测量学》笔记/期末复习资料。

@HNUSTer的博客 5562

OLED 驱动模块程序代码

作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。 本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。

大橙子的博客 4290

栈与函数调用

1、栈和函数调用的基本概念 栈(FIFO):在数据结构中是一个特殊的容器,遵守先入栈的数据后出栈。在计算机系统中是一个具有以上属性的动态内存区域。栈总是向下增长,压栈操作使栈顶地址减小,弹出操作使栈顶地址增大。 每个进程都会有自己的栈空间,而进程中的各个函数也会维护自己本身的一个栈的区域,这个区域包含了函数调用所需要维护的信息,这个区域常常被称为栈帧或活动记录,堆栈帧一般包含如下几个方面: 1、函数返回地址和参数 2、临时变量:包含函数的非静态局部变量以及编译器自动生成的其他临时变量 3、保存存的上下文:包

weixin_44108830的博客 2663

看完这篇爽文我终于学会了示波器(一)

示波器基础篇的介绍,希望对你有用,下次分享一下如何测试。

qq_45508321的博客 973

十二、缓冲区溢出漏洞原理

缓冲区溢出漏洞是一种非常普遍且危险的漏洞,在各种操作系统、应用软件中广泛存在,在路由器中也不例外。利用缓冲区溢出攻击,可以造成程序运行失败、系统宕机、更为严重的是,利用缓冲区溢出攻击可以执行非授权指令,进而取得系统特权进行各种非法操作。本次内容主要分享和总结了MIPS程序的栈空间缓冲区溢出原理,并通过代码示例让你更进一步的体会缓冲区溢出漏洞的利用效果。 MIPS栈原理 这里的缓冲区主要指的是栈,...

wanhex的博客 2118

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

高通camera调试经验总结

修改AF对焦模式 adb shell setprop vendor.debug.camera.af.manual 2 //使能手动对焦 adb shell setprop vendor.debug.camera.af.manual 0 //使能自动对焦

weixin_43381364的博客 1万+

博文视点 OpenParty第11期:世界黑客大会那些事

博文视点 OpenParty第11期:世界黑客大会那些事    亲爱的读者朋友:    您好!    2009年,博文视点Open Party共举办8场,累计到场2000人次,影响力辐射近5000人次,真正实现了博文视点Open Party的初衷,为读者朋友奉献更多图书以外的极具价值的技术观点和不一样的学习体验。    2010年,博文视点读

博文视点(北京)官方博客 1675

AI人工智能领域持续学习:提升技术能力的关键

在当今科技飞速发展的时代,AI人工智能已经渗透到我们生活的方方面面。本文章的目的就是帮助大家了解在AI人工智能领域持续学习的重要性,以及如何通过持续学习来提升自己的技术能力。文章会涵盖AI的核心概念、持续学习的原理和方法、实际应用场景等方面,让大家对AI领域的持续学习有一个全面的认识。本文首先会介绍AI人工智能的核心概念,让大家对这个领域有一个初步的了解。然后详细讲解持续学习的原理和方法,通过代码示例展示如何在实际项目中实现持续学习。接着会分析AI持续学习在不同场景的应用,推荐一些学习工具和资源。

AI 原生应用开发的博客 1289

栈溢出(stack overflow)到底是怎么回事(图解,超级详细)

栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值,在 VC/VS 下,默认是 1M,在 C-Free 下,默认是 2M,在 Linux GCC 下,默认是 8M。调用结束时,后调用的函数先出栈,先调用的函数后出栈。一个程序可以使用很多内存,不同的内存有不同的作用,为了方便管理,操作系统会对程序的内存空间进行分区,把具有相同作用的内存都归纳到一个区域之中。局部数据是我们在函数内部定义的,它们的作用域也仅限于函数内部,只有等到函数被真正调用时,才会被实际创建出来,也就是分配好内存。

m0_66929468的博客 466

深信服升级工具.zip

深信服设备升级工具

福州大学 计算机网络期末复习资料、实验报告.zip

福州大学 计算机网络期末复习资料、实验报告

软件漏洞分析入门

1 引子 To be the apostrophe which changed “Impossible” into “I’m possible” —— failwest 凉风有讯,秋月无边。 您是否梦想过能够像电影上演的那样黑进任意一台机器远程操控?您的梦想是否曾经被书店里边满架子的反黑,防毒,擒木马的扫盲书强暴的体无完肤? 从今天开始,准备陆续发一系列关于软件漏洞方面基础知识的帖子,包括软件漏洞...

whatday的专栏 1万+

2025电赛C题攻略[项目代码]

本文详细介绍了2025年全国大学生电子设计竞赛C题的完整通关攻略,重点讲解了如何利用单目摄像头在5秒内实现100cm至200cm范围内误差不超过2cm的测距精度,并实时显示功耗。内容涵盖了从硬件选型、离线标定、在线算法、功耗优化到现场调试的全流程实战指南。文章整合了国一选手方案、优快云高分博文、B站实测视频及官方说明,提供了系统架构设计、相机内参标定、外参基准线标定、PnP解算、倾斜补偿等关键技术细节,并分享了功耗优化策略和现场调试经验,帮助参赛者在资源受限的嵌入式环境中实现高精度测距。

【C语言】画图理解堆栈溢出

本篇博客用画图的方式补充之前提到的栈溢出问题,形象地理解栈溢出。 ​

有道无术, 术尚可求。有术无道, 止于术。 1万+

C++Builder DataSnap程序

cb2010_DataSnap_demo 从服务端的 access数据库读取数据到客户端,在C++Building2010下编译通过

函数调用堆栈的过程

本篇来分析函数调用的过程:通过下面一个简单的例子来进入话题:#include<stdio.h> int sum(int a,int b) { int tmp=0; tmp=a+b; return tmp; } int main() { int a=10; int b=20; int ret=0; ret=sum(a,b); printf("ret=%d\n",ret...

zhuoya_的博客 2万+

栈溢出和栈内存溢出的区别(一张图解释清楚)/ StackOverFlow和OutOfMemory的区别

目录 解释图: 何时发生栈内存溢出? 什么时候会发生栈溢出? 帮助记忆: 解释图: 上图是jvm内存模型中最为重要的三部分,方法区中存储的是类模板,堆中存放的是实例对象,每个线程都会生成一个栈。 何时发生栈内存溢出? 对于一台服务器而言,每一个用户请求,都会产生一个线程来处理这个请求,每一个线程对应着一个栈,栈会分配内存,此时如果请求过多,这时候内存不够了,就会发生栈内存溢出。...

isea_you's blog 1万+

缓冲区溢出(栈溢出)

栈溢出(缓冲区溢出) 在了解栈溢出之前,我们需要了解几个概念:堆栈是什么以及汇编语言中的call指令的特点。 堆栈: ​ 堆栈是一个特定的存储器或寄存器,其本质就是存储数据的内存。在实际应用中,堆栈会用于存储临时变、函数调用、中断切换时保存和恢复现场数据。 ​ 如图所示,堆栈就是内存中的某一片区域,每一个堆栈的内存单元都有唯一一个物理地址,且内存单元的大小都统一是4个字节大小。 并不是esp和ebp之间的范围才是堆栈,整个区域都是堆栈,而esp(栈顶)和esp(栈底)的作用只是定位数据的位置。

qq_20254219的博客 6986

系统栈与函数调用

1. 系统栈的工作原理1) 进程使用的内存 代码区:二进制机器代码 数据区:全局变量等 堆区:进程动态请求内存,用完归还。如动态分配和回收 栈区:用于动态存储函数间调用关系,也叫系统栈、调用栈,由系统自动维护 2) 系统栈int func_B(int arg_B1, int arg_B2) { int var_B1, var_B2; var_B1=arg_B1+arg_B2;

## 1225

C++ 之栈溢出

一 栈是什么 如下图所示,除程序不可使用的内存区外,有效内存区域可分为栈(statck)、堆(heap)、数据段、代码段。 整个内存都是用来存储数据的,栈也不例外。栈主要用来存储程序的局部数据。对于C/C++来说,局部数据是指在函数内部定义的数据,例如在函数内部定义的变量、指针、函数参数等,它们都要保存到栈中。 二 栈溢出 对于每个程序,栈能使用的内存是有...

WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人. 3918

5.5 堆溢出利用(下)——代码植入

堆溢出

qq_55202378的博客 1356

一文读懂|栈溢出攻击

简单来说,栈是一种LIFO(Last In Frist Out,后进先出)形式的数据结构。栈一般是从高地址向低地址增长,并且栈支持push(入栈)和pop(出栈)两个操作。push操作先将栈顶(sp指针)向下移动一个位置,然后将数据写入到新的栈顶;而pop操作会从栈顶读取数据,并且将栈顶(sp指针)向上移动一个位置。例如,将 0x100 压入栈,过程如下图所示:我们再来看看出栈。

网络战争的博客 442

完全分析failwest Sir's Shellcode

标 题: 【原创】完全分析failwest Sirs Shellcode作 者: fqucuo时 间: 2007-12-26,13:14链 接: http://bbs.pediy.com/showthread.php?t=57128【详细过程】这个Shellcode是failwest Sir 在第7讲中列出来的,如有需要,自己去下。相信很多菜鸟跟我一样,第一次接触shellcode,确已经被fa

小虎的空间 1245

函数调用的过程-栈

根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分:   (1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。   (2)数据区:用于存储全局变量等。   (3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回...

177

栈溢出基本原理的简单讲解

栈溢出基本原理的简单讲解 (新手上路,大牛还请自行跳过,不足之处,欢迎批评指正) 一 、预备知识: 缓冲区溢出简单介绍 缓冲区溢出:简单的说,缓冲区溢出就是超长的数据向小缓冲区复制,导致数据超出了小缓冲区,导致缓冲区其他的数据遭到破坏,这就是缓冲区溢出。而栈溢出是缓冲区溢出的一种,也是最常见的。只不过栈溢出发生在栈,堆溢出发生在堆,其实都是一样的。 栈的简单介绍 栈:栈是一种计算机系...

yan_star的博客 3万+
上一篇: MS08-025通过覆盖SSDT表进行执行shellcode
下一篇: 运行期修改可执行文件的路径和Command Line
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值