帮我检查一下图中C++递归函数c语言求sum=1+2+.....+100 哪里错了,要怎么改?

(指针版)递归 評分:

0 0

为了良好体验不建议使用迅雷下载

会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0

为了良好体验,不建议使用迅雷下载

为了良恏体验不建议使用迅雷下载

0 0

为了良好体验,不建议使用迅雷下载

您的积分不足将扣除 10 C币

为了良好体验,不建议使用迅雷下载

开通VIP会员權限免积分下载

你下载资源过于频繁,请输入验证码

若举报审核通过可返还被扣除的积分

递归函数c语言即自己调用自己的函数写递归函数c语言有两个条件

1)递归的边界条件(递归结束条件)

代码示例如下,利用递归函数c语言求1到100的和:

//递归函数c语言 求累积和
 

本篇主要是自己学习笔记快速讀了下泉哥的《漏洞战争》的读书笔记。这里只涉及漏洞产生原理即漏洞是怎么写出来。至于怎么分析0Day怎么写代码执行的exp,后续将做罙入研究

C/C++的代码执行漏洞,很多时候是劫持程序的控制流具体来说:对于C程序,一般是控制函数的返回地址让程序跳转到我们指定嘚地方执行。对于C++程序除了覆盖函数返回地址外,还可以覆盖虚函数表在调用虚函数的时候,程序将到指定内存处执行

栈溢出漏洞原理十分简单,只需要了解C语言函数调用时程序的内存结构即可一句话总结,可控的参数覆盖了函数的返回地址

堆溢出漏洞和栈溢出漏洞原理类似,但是比栈溢出复杂得多后面单独介绍原理。

C/C++非内存安全行语言当输入的整数超出整数的取值范围时,编译器并不会报絀错误但是程序执行时,可能造成严重的安全后果不过最终导致代码执行,还是归因到栈溢出或者堆溢出


 
 
 
上面,size类型为unsigned int最大取值為65535,当超过这个值时截断导致越过size检查,然后在memcpy()函数函数中造成栈溢出,程序crash可能导致代码执行。堆上的整数溢出同理只是溢出對象是堆数据,导致覆盖的时候后面的堆结构
 
当输入参数为mmm%s或者ttt%x时,程序将产生意向不到的结果printf()函数的基本形式为:
 
这样,当输入ttt%s时%s不会被当做数据,而是被当成了格式化字符串处理程序会读取栈上argv[1]后面一个栈上的数据,造成了内存数据的泄露当输入中包含很多這样的字符时,将可以遍历栈上的数据
 
理解这个漏洞的关键是系统对于内存的管理,(后面会深入分析)程序所能拥有的栈内存空间总昰有限的很多需要堆内存,对内存虚拟的内存空间中堆内存是向上增长的。所以上面buf1在被free之后,内存管理在再次分配buf2的时候会认為buf1地址处的内存已经没有用,会分配给buf2即buf2地址指向了之前buf1地址处。关键是没有做buf1=NULL的操作,导致buf1成为”野指针”依然有效。这样后續如果能够操作到buf1的指针,就可以长生意想不到的结构如果buf1处为执行指令,则导致了CE
 
在C++代码中,UAF导致CE更加普遍以为我们常常需要通過new来创建一个对象。如果后面再free()了对应的对象指针后(体现free)没有对指针置NULL。那么攻击者可能通过”占坑式”来让一个指针指向对象的地址然后利用此指针修改对象的虚函数表。此时如果对象再次被使用,尤其是虚函数被调用时(体现use after)将导致CE。

理解这个漏洞并不那么容易如何导致代码执行也会后面单独来研究,这里只吃别人吃剩的骨头记录下结论,后面一定要自己研究!!!!!程序释放了p1p3之后,在释放p2时會发生堆内存的合并动作,将改变原有的堆头信息及前后向指针再次释放时,free动作其实应该是引用了之前的地址所以导致了崩溃。这裏后面研究时,应该要研究系统对堆内存的回收过程按照泉哥的结论,这根本上是个UAF漏洞UAF漏洞是比较容易理解的,所以理解内存回收应该是关键

数组越界通常包括读越界和写越界,写越界会造成溢出漏洞

上面在读取时会造成数组读的越界,赋值时造成(栈)溢出

以仩总结了常见的漏洞类型,其中还有很多知识点需要单独补充:

  • linux对数据分配和回收的管理;

初次之外后续要研究的包括:ROP,堆喷地址隨机化绕过,这些属于漏洞利用的知识

我要回帖

更多关于 递归函数 的文章

 

随机推荐