首页
论坛
课程
招聘
hpxpj
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
17
回帖
90
粉丝
0

[原创]关于NetpwPathCanonicalize函数的清栈

2008-1-9 18:44 4971

[原创]关于NetpwPathCanonicalize函数的清栈

2008-1-9 18:44
4971
【文章标题】: 关于NetpwPathCanonicalize函数的清栈
【文章作者】: hpxpj
--------------------------------------------------------------------------------
【详细过程】
  在学习深入浅出MS06-040(看雪网络版).pdf中遇到了很多问题,不过都被我一一解决了,呵呵:)
  菜鸟嘛,自然学习困难一点
  
  在学到2.3节 踏雪无痕,恢复寄存器时shellcode就卡了好久
  shellcode是这样的:
  8BEC                 mov     ebp, esp
  66:83C5 10           add     bp, 10
  59                   pop     ecx //原来这是用来清除call ecx时保存在栈中的地址的
  55                   push    ebp
  8BEC                 mov     ebp, esp
  66:81EC 4404         sub     sp, 444
  50                   push    eax
  33C0                 xor     eax, eax
  66:B8 4404           mov     ax, 444
  50                   push    eax
  33C0                 xor     eax, eax
  66:B8 4404           mov     ax, 444
  50                   push    eax
  B8 777A837C          mov     eax, kernel32.Beep
  FFD0                 call    eax
  58                   pop     eax
  66:81C4 4404         add     sp, 444
  5D                   pop     ebp
  B9 5BF81775          mov     ecx, 7517F85B
  FFE1                 jmp     ecx
  就像failwest所说的这段shellcode既运行了我们的beep函数,又esp,ebp,eip恢复了调用前状态
  但是failwest只是在rpc试验中用到的,我就试想下我能不能把它拿到本地调用中去,修改了相应的数据(至于哪里需要改,看了failwest系列贴子就知道啦:)),成功的听到了"嘟"的声音,但是之后就是弹出出错的信息
  既然出错了,重新调试下,一步一步看哪里出错了
  在调试的过程中,我们成功的返回了
  但执行到(我用图来说明吧)

   原来
图一


图二

   通过这两个图我们知道:
   两次清参数
   然后cmp esi,esp
   显然会被call _chkesp会查出来
   终于知道原因了,呵呵 就到这里了,去自习,还有好多考试啊
  
--------------------------------------------------------------------------------
【经验总结】
  多多实践
  
--------------------------------------------------------------------------------

                                                       2008年01月09日 18:25:05

[公告]看雪论坛2020激励机制上线了!发帖不减雪币了!如何获得积分快速升级?

上传的附件:
  • 2.jpg (64.35kb,363次下载)
  • 3.jpg (51.86kb,363次下载)
  • 1.GIF (40.85kb,364次下载)
最新回复 (8)
qandzjl
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
3
回帖
40
粉丝
0
qandzjl 活跃值 2008-1-9 20:48
2
0
小饮下!
colboy
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
11
回帖
371
粉丝
0
colboy 活跃值 2008-1-9 23:28
3
0
[QUOTE=;]...[/QUOTE]
深入浅出MS06-040(看雪网络版).pdf
请问有下载地址么?~~~~~~
failwest
雪    币: 1948
能力值: (RANK:330 )
在线值:
发帖
32
回帖
91
粉丝
2
failwest 活跃值 8 2008-1-10 10:40
4
0
LZ同学很踏实啊,赞一个。怎么没有见你参加比赛,看到现在,A题中尝试去修复寄存器的只有两个人,你要做A题的化估计肯定能拿到这部分加分的
hpxpj
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
17
回帖
90
粉丝
0
hpxpj 活跃值 1 2008-1-10 12:34
5
0
谢谢您的鼓励
hpxpj
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
17
回帖
90
粉丝
0
hpxpj 活跃值 1 2008-1-10 12:40
6
0
在论坛里可以下载
http://bbs.pediy.com/showthread.php?t=56963
kevinqing
雪    币: 213
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
14
粉丝
0
kevinqing 活跃值 2008-1-17 15:04
7
0
编译成relase版本运行
vxasm
雪    币: 2014
活跃值: 活跃值 (10)
能力值: ( LV13,RANK:250 )
在线值:
发帖
22
回帖
310
粉丝
0
vxasm 活跃值 6 2008-5-4 12:31
8
0
其实这是 failwest 大侠的一个遗漏。

在声明 NetpwPathCanonicalize 函数指针时 failwest 用的是:
typedef void (*MYPROC)(LPTSTR);

NetpwPathCanonicalize 函数结尾有 retn 18 指令,这是因为Windows提供的API函数通常都是内部平栈的,所以在声明API函数的指针时都必须加上 WINAPI 标识(其实就是__stdcall),表明该函数是内部平栈,这也适用于所有的Windows函数指针,也就是说,声明 NetpwPathCanonicalize 函数指针的正确语法是:
typedef void (WINAPI *MYPROC)(LPTSTR);

这样,即使在本地运行也不会出现CHECK ESP的错误了。
zhuwg
雪    币: 278
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:470 )
在线值:
发帖
40
回帖
739
粉丝
1
zhuwg 活跃值 11 2008-5-4 12:50
9
0
很感谢楼上的解释。。
游客
登录 | 注册 方可回帖
返回