linux数组越界漏洞怎么利用

linux数组越界漏洞怎么利用,第1张

Linux c/c++上常用内存泄露检测工具有valgrind, Rational purify。Valgrind免费。Valgrind可以在 32位或64位 PowerPC/Linux内核上工作。

Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:

Memcheck 工具主要检查下面的程序错误:

• 使用未初始化的内存 (Use of uninitialised memory)

• 使用已经释放了的内存 (Reading/writing memory after it has been free’d)

• 使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)

• 对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)

• 申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)

• malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])

• src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)

Valgrind不检查静态分配数组的使用情况。

Valgrind占用了更多的内存--可达两倍于你程序的正常使用量。如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试

2.1. 下载安装

http://www.valgrind.org

安装

./configuremakemake install

2.2. 编译程序

被检测程序加入–g -fno-inline 编译选项保留调试信息。

2.3. 内存泄露检测

$ valgrind --tool=memcheck --log-file=/root/valgrind_log_all --leak-check=full --error-limit=no --show-reachable=yes --trace-children=yes /usr/local/sdata/sbin/rpcbakupsvr

其中--leak-check=full 指的是完全检查内存泄漏,--show-reachable=yes是显示内存泄漏的地点,--trace-children=yes是跟入子进程。当程序正常退出的时候valgrind自然会输出内存泄漏的信息。

1.内存泄露:

#include <stdio.h>void function()

{int *p = (int*)malloc(10*sizeof(int)) p[10] = 0

}int main()

{function() return 0

}

相关日志:

==20220== Memcheck, a memory error detector

==20220== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.

==20220== Using Valgrind-3.6.1-Debian and LibVEXrerun with -h for copyright info

==20220== Command: ./test

==20220== Parent PID: 20160

==20220==

==20220== Invalid write of size 4

==20220==at 0x80483FF: function (in /mnt/Documents/Training/valgrind/test)

==20220==by 0x8048411: main (in /mnt/Documents/Training/valgrind/test)

==20220== Address 0x41be050 is 0 bytes after a block of size 40 alloc'd

==20220==at 0x4028876: malloc (vg_replace_malloc.c:236)

==20220==by 0x80483F5: function (in /mnt/Documents/Training/valgrind/test)

==20220==by 0x8048411: main (in /mnt/Documents/Training/valgrind/test)

==20220==

==20220==

==20220== HEAP SUMMARY:

==20220== in use at exit: 40 bytes in 1 blocks

==20220== total heap usage: 1 allocs, 0 frees, 40 bytes allocated

==20220==

==20220== LEAK SUMMARY:

==20220==definitely lost: 40 bytes in 1 blocks

==20220==indirectly lost: 0 bytes in 0 blocks

==20220== possibly lost: 0 bytes in 0 blocks

==20220==still reachable: 0 bytes in 0 blocks

==20220== suppressed: 0 bytes in 0 blocks

==20220== Rerun with --leak-check=full to see details of leaked memory

==20220==

==20220== For counts of detected and suppressed errors, rerun with: -v

==20220== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)

2.使用未初始化的内存

#include <stdio.h>int main()

{int a if (a==1)

{printf("a==%d\n",a)

}return 0

}

日志分析:

==20345== Memcheck, a memory error detector

==20345== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.

==20345== Using Valgrind-3.6.1-Debian and LibVEXrerun with -h for copyright info

==20345== Command: ./test

==20345==

==20345== Conditional jump or move depends on uninitialised value(s)

==20345==at 0x80483F2: main (in /mnt/Documents/Training/valgrind/test)

==20345==

==20345==

==20345== HEAP SUMMARY:

==20345== in use at exit: 0 bytes in 0 blocks

==20345== total heap usage: 0 allocs, 0 frees, 0 bytes allocated

==20345==

==20345== All heap blocks were freed -- no leaks are possible

==20345==

==20345== For counts of detected and suppressed errors, rerun with: -v

==20345== Use --track-origins=yes to see where uninitialised values come from

==20345== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)

可以使用--track-origins=yes 得到更多的信息

3.内存读写越界

#include <stdio.h>int main()

{int *a = (int*)malloc(5*sizeof(int)) a[5] = 1 return 0

}

==20368== Memcheck, a memory error detector

==20368== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.

==20368== Using Valgrind-3.6.1-Debian and LibVEXrerun with -h for copyright info

==20368== Command: ./test

==20368==

==20368== Invalid write of size 4

==20368==at 0x8048404: main (in /mnt/Documents/Training/valgrind/test)

==20368== Address 0x41be03c is 0 bytes after a block of size 20 alloc'd

==20368==at 0x4028876: malloc (vg_replace_malloc.c:236)

==20368==by 0x80483F8: main (in /mnt/Documents/Training/valgrind/test)

==20368==

==20368==

==20368== HEAP SUMMARY:

==20368== in use at exit: 20 bytes in 1 blocks

==20368== total heap usage: 1 allocs, 0 frees, 20 bytes allocated

==20368==

==20368== LEAK SUMMARY:

==20368==definitely lost: 20 bytes in 1 blocks

==20368==indirectly lost: 0 bytes in 0 blocks

==20368== possibly lost: 0 bytes in 0 blocks

==20368==still reachable: 0 bytes in 0 blocks

==20368== suppressed: 0 bytes in 0 blocks

==20368== Rerun with --leak-check=full to see details of leaked memory

==20368==

==20368== For counts of detected and suppressed errors, rerun with: -v

==20368== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)

4.内存申请释放管理错误

#include <stdio.h>int main()

{int *a = new int[5] /*free(a)*/delete a return 0

}

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

可以使用相应的软件测试工具对软件进行检测。

1. ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。

2. Dmalloc-Debug Malloc Library.

3. Electric

Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。

4. Leaky-Linux下检测内存泄漏的程序。

5. LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。

6. MEMWATCH-由Johan

Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。

7. Valgrind-Debugging and profiling Linux programs, aiming at

programs written in C and C++.

8. KCachegrind-A visualization tool for the profiling data

generated by Cachegrind and Calltree.

9. Leak

Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。

10. IE Leak Detector

(Drip/IE Sieve)-Drip和IE Sieve leak

detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。

11. Windows Leaks

Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于Win API调用钩子。

12. SAP Memory

Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse

RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。

13. DTrace-即动态跟踪Dynamic

Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测 *** 作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。

14. IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus

将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。

15. Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft

Visual C++的一个插件运行。

16. Compuware DevPartner for Visual C++ BoundsChecker

Suite-为C++开发者设计的运行错误检测和调试工具软件。作为Microsoft Visual Studio和C++ 6.0的一个插件运行。

17. Electric Software GlowCode-包括内存泄漏检查,code

profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。

18. Compuware DevPartner Java

Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。

19. Quest JProbe-分析Java的内存泄漏。

20. ej-technologies JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G666#76114F-1olm9mv1i5uuly#0126

21. BEA JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。

22. SciTech Software AB .NET Memory

Profiler-找到内存泄漏并优化内存使用针对C#,VB.Net,或其它.Net程序。

23. YourKit .NET &Java Profiler-业界领先的Java和.NET程序性能分析工具。

24. AutomatedQA AQTime-AutomatedQA的获奖产品performance profiling和memory

debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和

GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net

1.0,1.1,2.0,3.0和Windows 32/64位应用程序。

25. JavaScript Memory Leak Detector-微软全球产品开发欧洲团队(Global Product

Development- Europe team, GPDE)

发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7302826.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存