-
-
[原创]漏洞利用中级技巧中思路的局限性
-
发表于:
2014-2-23 15:34
4035
-
看了仙果牛的文章,感觉他的标题写得比较大,而且思路比较局限,专门开贴讨论一下
我这代码是这样的
001B:00130DF0 8BF4 MOV ESI,ESP
001B:00130DF2 83EE40 SUB ESI,40
001B:00130DF5 8B36 MOV ESI,[ESI]
001B:00130DF7 B8FFFF0080 MOV EAX,8000FFFF ;返回值
001B:00130DFC 8BEC MOV EBP,ESP
001B:00130DFE 83C540 ADD EBP,40 ;EBP
001B:00130E01 FFE6 JMP ESI
001B:00130E03 0000 ADD [EAX],AL ;EBX要可写
001B:00130E05 0001 ADD [ECX],AL
-------------要真实利用jmp esi往00130e06跳下面可以填40字节的egghunter足够了------
咋个说哩,又看了下楼主的文章到也没太多问题,不过想说的是大家千万别被他自已的思路所局限了.总之我个人的感觉是让程序不出错的办法是n多的,大家只用记住最终的目的尽量完美就行了.
另外测了好多次在我这儿0014017c这个硬编码地址通用性不行.
再说具体点吧:
funX call funA
funA call funB
funB call funC
funA中代码为:
xxx
xxx
xxx
call funb
xxx
ret
funB中代码为
xxx
xxx
call func
xxx
xxx
溢出指令
xxx
ret
funB函数中产生溢出,覆盖栈中保存的返回到funA中的地址.
楼主的思路是在esp高地址方向找返回到funx中的地址,从funb
直接返回到funx.这就要求覆盖的数据不能太多!!所以楼主
对定位shellcode没办法只有使用硬编码.
这是最简单的一种思路.其实思路还是n多的,比如我的例子中
我分析了一下call func的代码,发现还可以跳到esp更低地址方向
中残留的call func后返回到funb中的地址.这就相当于重新执行了一次func中的最后的ret
然后我给定一个返回值然后就直接跑到funb的错误处理代码流程了.
这种思路的好处就是:
也许shellcode可以相对前种方式更长一些,也不用硬编码定位shellcode,对于
esp中更低地址去找残留的返回地址,更低多少这个和func函数的参数个数相关,但同一程序
一般是不会有变化的所以更通用.
其它:我的这个思路在03年的一个doc exp中就有用到.
如果把漏洞的正常返回当成一个中级技巧说开了去,我觉得好玩的东西还真的很多
比如ie下面那个调用SHDOCVW中的65号功能,恢复IE进程+hook
LdrShutdownThread\MessageBeep\UnhandledExceptionFilter
又比如直接利用gdi重绘窗口技巧.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)