|
![]() | 作者: bridex [bridex]
![]() |
登录 |
作者:czy <czy82@elong.com> 主页:http://www.nsfocus.net 日期:2004-03-10 /* * For x86/EWindows 2k & VC 6 * cl vulnerable_0.c /nologo /Os /G6 /W3 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /link /RELEASE */ #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma comment( linker, "/INCREMENTAL:NO" ) #pragma comment( linker, "/subsystem:console" ) int __cdecl main ( int argc, char * argv[] ) { unsigned char buf[8]; if ( 2 != argc ) { fprintf( stderr, "Usage: %s <any string>\n", argv[0] ); return( EXIT_FAILURE ); } strcpy( buf, argv[1] ); printf( "%s\n", buf ); return( EXIT_SUCCESS ); } /* end of main */ 1) 利用监视点定位导致溢出的代码点 先说说如何尽早中断在vulnerable_0.exe进程空间中,然后介绍如何利用监视点 定位导致溢出的代码点。 用VC写的程序一般运行之初都要调用GetCommandLineA这个API我们对它下个断点就可以了多按几下f12以回到应用程序空间。 代如下参数执行我们的程序: vulnerable_0.exe AAAAAAAAAAAAAAAA 一共16个A 前8个正常中间4个覆盖ebp,最后四个覆盖eip 打开SOFTICE的Faults on功能。 这时程序出错,SOFTICE弹出"0x41414141" 指令引用的 "0x41414141" 内存。该内存不能为 "read"。这儿注意看ESP寄存器! esp这时为0012FF88 eip,ebp都为41414141,那么可以肯定本来eip,ebp的值是放在 0012FF84和0012FF80中的! 这个有一个问题就是:现在0012FF78到0012FF88处的16个字节不是41h哟,为什么呢? 我想是系统的seh进行了处理。但在溢出发生之前它们的值肯定是41h,所以下监视点 bpmd 0012FF78 w if ((*0012FF78)==41414141) 再次提醒,bpm断点随进程空间消失而消失,因此应该尽早中断在vulnerable_0.exe 进程空间中,然后设置bpm断点,而不是其它时刻 这时监视点被命中。。 这时代码在 001B:00401161 83C704 ADD EDI,04 001B:00401163 BAFFFEFE7E MOV EDX,7EFEFEFF 001B:004011.. 8B01 MOV EAX,[ECX] 001B:004011.. 03D0 ADD EDX,EAX ... ... 001B:004011.. EBC7 JMP 004011.. 001B:004011.. 8917 MOV [EDI],EDX 这时的ebp,eip存放的地方还是正常的,f10走几步 一个leave指令ebp就被覆盖了然后一个ret指令eip也就覆盖。。那么我们就找到了 出错的地方了。 一点点感想: 看了四哥的<利用监视点定位导致溢出的代码点>一文(绿盟月刊44期) 写了这个。个人感觉对于如何快速的找到溢出点还有很多值得大家商榷 和探讨的地方。溢出的种类很多不同的种类都有不同的调试办法,不求 通用,但求对于每一种办法有一个比较正确的思路,而对于这些我人个 脑子里面还很模糊望各位大哥多指点。 另外:icedump没装对。。不能把softice的屏幕内容找出来。。各位不好意思了哈。 |
地主 发表时间: 04-04-12 11:01 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号