驱动管家:安全、高效、精准的专业驱动下载站!

源程序的OEP开头为什么都是以EBP代替ESP?

2018-03-15 09:37:42责编:llp   来源:驱动管家     人气:

在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值,达到堆栈平衡的目的。

源程序的OEP开头为什么都是以EBP代替ESP?

应用以前说过的一段话:

原程序的OEP,通常是一开始以 Push EBP 和MOV Ebp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。

为什么要这样呢?为什么几乎每个程序都是的开头能?因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的:

1.让EBP保存ESP的值;

2.在结束的时候调用

mov esp,ebp

pop ebp

retn

或者是

leave

retn

两个形式是一个意思。

这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。

2.推广的ESP定律

在寻找OEP的时候,往往下断HW ESP-4不成功,除了壳代码将硬件断点删除了以外,很可能的情况就是因为壳代码在运行到OEP的时候他的ESP已经不再是在EP时候的ESP(12FFC4)了,这样我们下断当然是不成功的。

那么如何找到在壳到达OEP的时候的堆栈的值将是关键。

在这里我们应用的关键是

Push EBP

MOV Ebp,Esp----》关键是这句

我来解释一下,当程序到达OEP的时候Push EBP这句对于ESP的值来说就是ESP-4,然后是ESP-4赋给了EBP,而做为保存ESP值作用的EBP寄存器在这个“最上层的程序”中的值将始终不会改变。虽然他可能在进入子call里面以后会暂时的改变(用于子程序的堆栈平衡)但是在退出了以后依*pop ebp这一句将还原原来的EBP的值。

以这句做为突破口,就是说只要我们能断在“最上层的程序”中,就能通过观察EBP的值得到壳在JMP到OEP的时候的ESP的值了。

3.实战

来看看pespin1.1的壳,在pespin1.0的壳中,我们使用HW 12FFC0能很容易的找到stolen code的地方,但是到pespin1.1的时候,我们就不行了。用HW 12FFC0根本断不下来。

现在我们就使用这个推广的ESP定律,载入程序后来到最后的一个异常

0040ED85 2BDB sub ebx,ebx //停在这里

0040ED87 64:8F03pop dword ptr fs:[ebx]

0040ED8A 58 pop eax

0040ED8B 5D pop ebp

0040ED8C 2BFF sub edi,edi

0040ED8E EB 01jmp short pespin1_.0040ED91

0040ED90 C466 81les esp,fword ptr ds:[esi-7F]

我用使用内存断点办法来到FOEP处

004010D3 0000 add byte ptr ds:[eax],al

004010D5 0000 add byte ptr ds:[eax],al

004010D7 0000 add byte ptr ds:[eax],al

004010D9 0000 add byte ptr ds:[eax],al

004010DB 0000 add byte ptr ds:[eax],al

004010DD 0000 add byte ptr ds:[eax],al

004010DF 75 1Bjnz short pespin1_.004010FC //这里是FOEP

004010E1 56 push esi

004010E2 FF15 99F44000call dword ptr ds:[40F499]

004010E8 8BF0 mov esi,eax

004010EA 8A00 mov al,byte ptr ds:[eax]

好了,这里就是“最上层的程序”的地方了,看看寄存器

EAX 00141E22

ECX 0040C708 pespin1_.0040C708

EDX 0040C708 pespin1_.0040C708

EBX 0040C708 pespin1_.0040C708

ESP 0012F978

EBP 0012F9C0//注意这里

ESI 00141EE0

EDI 0040E5CD pespin1_.0040E5CD

EIP 004010DF pespin1_.004010DF

看到了吧,EBP=0012F9C0,我们来想象一下这个值是怎么得到的。

首先肯定是通过MOV ESP,EBP这一句,也就是说ESP这时是0012F9C0的,然而上面还有一句PUSH EBP也就是说ESP在到达OEP的时候应该是0012F9C4的。好了得到这个结论我们就能很快的找到stolen code的所在了。

重来停在最后的异常

0040ED85 2BDB sub ebx,ebx //停在这里

0040ED87 64:8F03pop dword ptr fs:[ebx]

0040ED8A 58 pop eax

0040ED8B 5D pop ebp

0040ED8C 2BFF sub edi,edi

0040ED8E EB 01jmp short pespin1_.0040ED91

0040ED90 C466 81les esp,fword ptr ds:[esi-7F]

然后下断HW 0012F9C0 ,F9运行,来到这里

0040D8FB 61 popad

0040D8FC 55 push ebp

0040D8FD EB 01jmp short pespin1_.0040D900 //停在这里

0040D8FF 318B ECEB01ACxor dword ptr ds:[ebx AC01EBEC],ecx

0040D905 83EC 44sub esp,44

0040D908 EB 01jmp short pespin1_.0040D90B

0040D90A 72 56jb short pespin1_.0040D962

0040D90C EB 01jmp short pespin1_.0040D90F

0040D90E 95 xchg eax,ebp

0040D90F FF15 6CF34000call dword ptr ds:[40F36C]

0040D915 EB 01jmp short pespin1_.0040D918

于是就很快的找到了stolen code的所在了。

4.总结

上面的这个办法大概可以总结以下的步骤:

(1).直接或间接的断在“最上层的程序”的地方。

(2).得到“最上层的程序”的EBP的值。

(3).利用程序初始化的两个固定语句找到壳JMP到OEP的堆栈值。这个办法有很大的局限性,因为只有VC和delphi程序使用这个初始化的开头。

但是找到“最上层的程序”的办法除了内存断点还有很多办法,例如对于VC来说使用 bp ExitProcess也是一个很好的断点,可以直接得到EBP的数值。

5.后话

原来这个办法有很强的前提条件,不是一个很具普遍性的办法,我原来也不想单独的提出来,但是对于jney2兄弟的anti-ESP定律来说这个办法却是一个解决之道。

当然还有更多的办法,在这里我只想说很多事情有矛就有盾,没有什么办法是一定没有漏洞的,只是希望这篇文章给大家阔宽思路,起到抛砖引玉的作用。

  • eset卸载不干净?教你手动彻底卸载eset的方法

    eset卸载不干净?教你手动彻底卸载eset的方法

    如何手动卸载ESET安全产品?KB的解决方案ID:SOLN2289 |最后修改:2010年4月15日在试图手动卸载ESET安全产品,第一次尝试使用安装ESET开始菜单卸载程序与ESET聪明的安全4 x或ESET NOD32防毒软件4 x的规定点击这

    详情2018-02-11 08:44:12责编:llp   来源:驱动管家     
  • 加密锁的优缺点介绍 加密锁怎么加密?

    加密锁的优缺点介绍 加密锁怎么加密?

    盗版,对大多数软件开发者来说都是一个令人担心的问题。在采用了加密锁加密后的软件会不会被黑客破解呢?理论上说没有不能破解的软件,即使是纯数学的密码加密也有被破解的可能,只不过破解的时间可能是个天文数

    详情2018-01-31 10:52:02责编:llp   来源:驱动管家     
  • 怎么入侵Oracle数据库?使用了这些操作命令

    怎么入侵Oracle数据库?使用了这些操作命令

    本文按步骤讲解如何入侵Oracle数据库时常用的操作命令整理。1、su–Oracle不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。2、sqlplus nolog 或sqlplus system manager 或 sqlplu

    详情2018-03-12 16:30:19责编:llp   来源:驱动管家     
  • 什么是sharepoint server?sharepoint server存在跨站脚本漏洞

    什么是sharepoint server?sharepoint server存在跨站脚本漏洞

    SharePoint Server是一个服务器功能集成套件,提供全面的内容管理和企业搜索,加速共享业务流程并简化跨界限信息共享。SharePoint Services 2 0中存在跨站脚本漏洞,在使用文本编辑器添加图片后保存网页时,没

    详情2018-01-18 16:38:52责编:llp   来源:驱动管家     
  • 热备份路由器协议详解 vmac地址由哪些部分组成?

    热备份路由器协议详解 vmac地址由哪些部分组成?

    Part I: FundamentalHSRP(Hot Standby Router Protocol):Cisco私有的第3层协议。HSRP为IP网络提供网络冗余,确保用户流量能立即并透明地恢复网络边界设备或接入电路中的第一跳故障。在LAN中,多个router组成

    详情2018-02-03 14:32:39责编:llp   来源:驱动管家     
  • 家用无线路由器怎么设置才安全?学会这六招摆平家庭无线网络安全

    家用无线路由器怎么设置才安全?学会这六招摆平家庭无线网络安全

    伴随着各运营商的宽带大提速,无线已经成为家庭组网的首选。老百姓真真切切地感觉到:无线真好!而且各厂商的在无线路由器的设置上也尽力做到人性化,以帮助大叔大妈们也能轻松的设置家庭无线网络,但一提到如何让

    详情2018-01-07 15:54:21责编:llp   来源:驱动管家     
  • 跨站脚本钓鱼攻击是怎么回事?具体步骤是什么?

    跨站脚本钓鱼攻击是怎么回事?具体步骤是什么?

    最近跨站脚本漏洞好像比较火,国内的一些比较出名的WEB程序都陆续暴出了跨站脚本漏洞,但是一提到跨站脚本漏洞的攻击方式大家都哑火了,因为在常规的概念中这种漏洞最多是挂网页木马,获取COOKIE之类,属于典型的

    详情2018-03-03 09:58:43责编:llp   来源:驱动管家     
  • dvbbs8.2漏洞代码 怎么通过动网漏洞拿下后台?

    dvbbs8.2漏洞代码 怎么通过动网漏洞拿下后台?

    dvbbs8 2漏洞补下载地址:http: bbs dvbbs net dispbbs asp?boardid=8&;Id=1519564 紧急安全补丁0530dvbbs8 2漏洞的产生login asp 这个文件的97行Function Dvbbs_ChkLogin开始有以下代码:username=trim(Dvbbs

    详情2018-02-12 19:52:21责编:llp   来源:驱动管家     
  • 手工注入猜解用语 ascii逐字解码法

    手工注入猜解用语 ascii逐字解码法

    猜解表名:and exists (select * from 表名)猜解列名:and exists (select 字段 from 表名)UNION法:联合查询:select name,password,id from user union select user,pwd,uid from爆指定表名内

    详情2018-02-06 11:03:54责编:llp   来源:驱动管家     
  • 网站漏洞扫描工具:awvs怎么进行网站漏洞扫描

    网站漏洞扫描工具:awvs怎么进行网站漏洞扫描

    使用AWVS对域名进行全局分析,深入探索:首先,介绍一下AWVS这个工具。 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。

    详情2018-01-09 10:33:24责编:llp   来源:驱动管家