首页
社区
课程
招聘
竹君兄弟,你这个还能堆栈平衡吗
发表于: 2010-10-12 20:39 5029

竹君兄弟,你这个还能堆栈平衡吗

2010-10-12 20:39
5029
就是红色的那句push ebp
这个被调用函数经过传递参数(压栈)后,
又做了push ebp,但这个push并没有相应的pop
这样是不是堆栈不平衡了?

_declspec (naked) NTSTATUS OriginalObReferenceObjectByHandle(
IN HANDLE  Handle,
															 
		IN ACCESS_MASK  DesiredAccess,
															 
		IN POBJECT_TYPE  ObjectType  OPTIONAL,
															 
		IN KPROCESSOR_MODE  AccessMode,
															 
		OUT PVOID  *Object,
															 
		OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL)
															 
{
	
	_asm
		
	{   
		
		    mov edi,edi
			[COLOR="Red"]push ebp[/COLOR]
			mov ebp,esp
			mov eax,ObReferenceObjectByHandle
			add eax,5
			jmp eax                
			
	}
	
}






[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
的确没平衡。。。代码后面加pop
2010-10-12 20:46
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
当然平衡了。
_declspec (naked)

    mov edi,edi
      push ebp
      mov ebp,esp

这里的指令是原函数的开始5个字节的指令。

    mov eax,ObReferenceObjectByHandle
      add eax,5
      jmp eax  

这里可能改为
    push ObReferenceObjectByHandle
      ADD DWORD PTR SS:[ESP],5
      retn

会好一点。
2010-10-12 21:08
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这个是ObReferenceObjectByHandle被替换的字节 由ObReferenceObjectByHandle函数自己去平衡 你没看后面是jmp过去的
2010-10-12 21:11
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
to三楼的朋友,
你说平衡的主要原因是那个_declspec (naked)吗?
2010-10-12 21:24
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
4 楼的朋友,我不明白的是:ObReferenceObjectByHandle函数本身是平衡的,
但在函数体里有个push ebp,这样,在函数调用结束时pop,是不是少了一个?
但在人家竹君的程序,并没有蓝屏,说明是平衡的
但是,我不知道平衡的原因
2010-10-12 21:29
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
自己调试,看堆栈,然后就知道结果了.一碰到问题就问人,那样学习效率很低的,尤其是自己能解决的问题.
2010-10-12 21:31
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
ls的朋友,我的电脑用不了虚拟机
我电脑cpu 赛扬857,内存256m
调试不了啊
2010-10-12 21:50
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
具体要看 ObReferenceObjectByHandle 这个函数前几条指令是什么了 如果前5个字节中有一条PUSH指令的话并且在ObReferenceObjectByHandle 这个函数体内堆栈本身是平衡的话,那么堆栈是平衡的!

没有仔细分析,不知道对不对。
2010-10-12 22:27
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
pop ebp在原始的ObReferenceObjectByHandle函数里。。。
楼主该升级下电脑了,虚拟机用不了,学驱动的路真的会很杯具~

而且,Inline Hook这东西,ring3和ring0根本没什么差别,楼主不如在ring3下练习好了,就算出错也最多是程序挂掉,不会蓝屏~~
2010-10-12 23:43
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
11
13:   __declspec( naked ) void _stdcall PushDW( unsigned int nVal )
14:   {
00401050   ret
15:       __asm
16:       {
17:           ret
18:       }
19:   }



lkd> u ObReferenceObjectByHandle
nt!ObReferenceObjectByHandle:
805bc482 8bff            mov     edi,edi
805bc484 55              push    ebp
805bc485 8bec            mov     ebp,esp
805bc487 51              push    ecx


看完上面两个应该知道为什么了吧
大概是跳过ObReferenceObjectByHandle前5个字节hook,自己实现了前五个字节call ObReferenceObjectByHandle
2010-10-12 23:51
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼上,和楼上的楼上,谢谢啦
我明白了,原来pop在后面。

再次感谢以上各位
2010-10-12 23:54
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
同感,跟他说过了一次了。。。

建议LZ先学习下原理,别一直抄代码。
2010-10-13 10:08
0
游客
登录 | 注册 方可回帖
返回
//