会员注册 | 登录 | 微信快捷登录 支付宝快捷登录 QQ登录 微博登录 | 帮助中心 人人文库renrendoc.com美如初恋!
站内搜索 百度文库

热门搜索: 直缝焊接机 矿井提升机 循环球式转向器图纸 机器人手爪发展史 管道机器人dwg 动平衡试验台设计

   首页 人人文库网 > 资源分类 > PDF文档下载

ESP定律.pdf

  • 资源星级:
  • 资源大小:321.95KB   全文页数:10页
  • 资源格式: PDF        下载权限:注册会员/VIP会员
您还没有登陆,请先登录。登陆后即可下载此文档。
  合作网站登录: 微信快捷登录 支付宝快捷登录   QQ登录   微博登录
友情提示
2:本站资源不支持迅雷下载,请使用浏览器直接下载(不支持QQ浏览器)
3:本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

ESP定律.pdf

图文详解ESP定律脱壳修复默认分类200905131013阅读211评论0字号大中小ASPack2.12AlexeySolodovnikov一个压缩壳,今天我们用ESP定律脱壳,使用LoadPE来保存Dump脱壳后文件,并用IR(ImportREC)来修复脱壳文件。005AD00160pushadOD载入后来到这里005AD002E803000000call005AD00A我们F8一次来到该CALL,此时我们看寄存器窗口的ESP地址005AD007E9EB045D45jmp45B7D4F7005AD00C55pushebp005AD00DC3retn我们使用ESP定律脱壳,见图文说明005AD3B0/7508jnzshort005AD3BAF9一次后来到这里005AD3B2|B801000000moveax,1005AD3B7|C20C00retn0C005AD3BA\68181C5000push00501C18005AD3BFC3retn退出这个retn后就来到OEP处00501C1855pushebp程序的OEP使用LoadPE保存文件IR修复看我操作00501C198BECmovebp,esp00501C1B83C4F0addesp,1000501C1E53pushebx00501C1FB800185000moveax,0050180000501C24E81F4CF0FFcall00406848然后我们使用LoadPE脱壳,看我操作使用IR修复第一步我们选择我们调试的原程序第二步我们在OEP处填入数据此时我们看下OD中的OEP地址OEP00501C180040000000101C18所以我们在此填入OEP00101C18然后点自动搜索IAT点确定第三步我们选择获取输入表看上方的输入表数据都为真无需修复所以我们点修复抓取文件即我们使用LoadPE脱壳的文件我们运行修复好的文件,OK,可以运行,再用PEiD查壳BorlandDelphi6.07.当无法使用ESP定律时EBP的妙用发布时间2007.02.110448来源赛迪网安全社区作者Lenus1.了解EBP寄存器在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值,达到堆栈平衡的目的。应用以前说过的一段话原程序的OEP,通常是一开始以PushEBP和MOVEbp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。为什么要这样呢为什么几乎每个程序都是的开头能因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的1.让EBP保存ESP的值2.在结束的时候调用或者是两个形式是一个意思。这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。2.推广的ESP定律在寻找OEP的时候,往往下断HWESP4不成功,除了壳代码将硬件断点删除了以外,很可能的情况就是因为壳代码在运行到OEP的时候他的ESP已经不再是在EP时候的ESP(12FFC4)了,这样我们下断当然是不成功的。那么如何找到在壳到达OEP的时候的堆栈的值将是关键。在这里我们应用的关键是movesp,ebppopebpretnleaveretn我来解释一下,当程序到达OEP的时候PushEBP这句对于ESP的值来说就是ESP4,然后是ESP4赋给了EBP,而做为保存ESP值作用的EBP寄存器在这个最上层的程序中的值将始终不会改变。虽然他可能在进入子call里面以后会暂时的改变(用于子程序的堆栈平衡)但是在退出了以后依popebp这一句将还原原来的EBP的值。以这句做为突破口,就是说只要我们能断在最上层的程序中,就能通过观察EBP的值得到壳在JMP到OEP的时候的ESP的值了。3.实战来看看pespin1.1的壳,在pespin1.0的壳中,我们使用HW12FFC0能很容易的找到stolencode的地方,但是到pespin1.1的时候,我们就不行了。用HW12FFC0根本断不下来。现在我们就使用这个推广的ESP定律,载入程序后来到最后的一个异常我用使用内存断点办法来到FOEP处好了,这里就是最上层的程序的地方了,看看寄存器看到了吧,EBP0012F9C0,我们来想象一下这个值是怎么得到的。PushEBPMOVEbp,Esp关键是这句0040ED852BDBsubebx,ebx//停在这里0040ED87648F03popdwordptrfsebx0040ED8A58popeax0040ED8B5Dpopebp0040ED8C2BFFsubedi,edi0040ED8EEB01jmpshortpespin1_.0040ED910040ED90C46681lesesp,fwordptrdsesi7F004010D30000addbyteptrdseax,al004010D50000addbyteptrdseax,al004010D70000addbyteptrdseax,al004010D90000addbyteptrdseax,al004010DB0000addbyteptrdseax,al004010DD0000addbyteptrdseax,al004010DF751Bjnzshortpespin1_.004010FC//这里是FOEP004010E156pushesi004010E2FF1599F44000calldwordptrds40F499004010E88BF0movesi,eax004010EA8A00moval,byteptrdseaxEAX00141E22ECX0040C708pespin1_.0040C708EDX0040C708pespin1_.0040C708EBX0040C708pespin1_.0040C708ESP0012F978EBP0012F9C0//注意这里ESI00141EE0EDI0040E5CDpespin1_.0040E5CDEIP004010DFpespin1_.004010DF首先肯定是通过MOVESP,EBP这一句,也就是说ESP这时是0012F9C0的,然而上面还有一句PUSHEBP也就是说ESP在到达OEP的时候应该是0012F9C4的。好了得到这个结论我们就能很快的找到stolencode的所在了。重来停在最后的异常然后下断HW0012F9C0,F9运行,来到这里于是就很快的找到了stolencode的所在了。4.总结上面的这个办法大概可以总结以下的步骤1.直接或间接的断在最上层的程序的地方。2.得到最上层的程序的EBP的值。3.利用程序初始化的两个固定语句找到壳JMP到OEP的堆栈值。这个办法有很大的局限性,因为只有VC和delphi程序使用这个初始化的开头。但是找到最上层的程序的办法除了内存断点还有很多办法,例如对于VC来说使用bpExitProcess也是一个很好的断点,可以直接得到EBP的数值。5.后话原来这个办法有很强的前提条件,不是一个很具普遍性的办法,我原来也不想单独的提出来,但是对于jney2兄弟的antiESP定律来说这个办法却是一个解决之道。当然还有更多的办法,在这里我只想说很多事情有矛就有盾,没有什么办法是一定没有漏洞的,只是希望这篇文章给大家阔宽思路,起到抛砖引玉的作用。t0030040ED852BDBsubebx,ebx//停在这里0040ED87648F03popdwordptrfsebx0040ED8A58popeax0040ED8B5Dpopebp0040ED8C2BFFsubedi,edi0040ED8EEB01jmpshortpespin1_.0040ED910040ED90C46681lesesp,fwordptrdsesi7F0040D8FB61popad0040D8FC55pushebp0040D8FDEB01jmpshortpespin1_.0040D900//停在这里0040D8FF318BECEB01ACxordwordptrdsebxAC01EBEC,ecx0040D90583EC44subesp,440040D908EB01jmpshortpespin1_.0040D90B0040D90A7256jbshortpespin1_.0040D9620040D90CEB01jmpshortpespin1_.0040D90F0040D90E95xchgeax,ebp0040D90FFF156CF34000calldwordptrds40F36C0040D915EB01jmpshortpespin1_.0040D9181.了解EBP寄存器在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值,达到堆栈平衡的目的。应用以前说过的一段话原程序的OEP,通常是一开始以PushEBP和MOVEbp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。为什么要这样呢为什么几乎每个程序都是的开头能因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的1.让EBP保存ESP的值2.在结束的时候调用或者是两个形式是一个意思。这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。2.推广的ESP定律在寻找OEP的时候,往往下断HWESP4不成功,除了壳代码将硬件断点删除了以外,很可能的情况就是因为壳代码在运行到OEP的时候他的ESP已经不再是在EP时候的ESP(12FFC4)了,这样我们下断当然是不成功的。那么如何找到在壳到达OEP的时候的堆栈的值将是关键。在这里我们应用的关键是我来解释一下,当程序到达OEP的时候PushEBP这句对于ESP的值来说就是ESP4,然后是ESP4赋给了EBP,而做为保存ESP值作用的EBP寄存器在这个最上层的程序中的值将始终不会改变。虽然他可能在进入子call里面以后会暂时的改变(用于子程序的堆栈平衡)但是在退出了以后依popebp这一句将还原原来的EBP的值。以这句做为突破口,就是说只要我们能断在最上层的程序中,就能通过观察EBP的值得到壳在JMP到OEP的时候的ESP的值了。3.实战movesp,ebppopebpretnleaveretnPushEBPMOVEbp,Esp关键是这句来看看pespin1.1的壳,在pespin1.0的壳中,我们使用HW12FFC0能很容易的找到stolencode的地方,但是到pespin1.1的时候,我们就不行了。用HW12FFC0根本断不下来。现在我们就使用这个推广的ESP定律,载入程序后来到最后的一个异常我用使用内存断点办法来到FOEP处好了,这里就是最上层的程序的地方了,看看寄存器看到了吧,EBP0012F9C0,我们来想象一下这个值是怎么得到的。首先肯定是通过MOVESP,EBP这一句,也就是说ESP这时是0012F9C0的,然而上面还有一句PUSHEBP也就是说ESP在到达OEP的时候应该是0012F9C4的。好了得到这个结论我们就能很快的找到stolencode的所在了。重来停在最后的异常然后下断HW0012F9C0,F9运行,来到这里0040ED852BDBsubebx,ebx//停在这里0040ED87648F03popdwordptrfsebx0040ED8A58popeax0040ED8B5Dpopebp0040ED8C2BFFsubedi,edi0040ED8EEB01jmpshortpespin1_.0040ED910040ED90C46681lesesp,fwordptrdsesi7F004010D30000addbyteptrdseax,al004010D50000addbyteptrdseax,al004010D70000addbyteptrdseax,al004010D90000addbyteptrdseax,al004010DB0000addbyteptrdseax,al004010DD0000addbyteptrdseax,al004010DF751Bjnzshortpespin1_.004010FC//这里是FOEP004010E156pushesi004010E2FF1599F44000calldwordptrds40F499004010E88BF0movesi,eax004010EA8A00moval,byteptrdseaxEAX00141E22ECX0040C708pespin1_.0040C708EDX0040C708pespin1_.0040C708EBX0040C708pespin1_.0040C708ESP0012F978EBP0012F9C0//注意这里ESI00141EE0EDI0040E5CDpespin1_.0040E5CDEIP004010DFpespin1_.004010DF0040ED852BDBsubebx,ebx//停在这里0040ED87648F03popdwordptrfsebx0040ED8A58popeax0040ED8B5Dpopebp0040ED8C2BFFsubedi,edi0040ED8EEB01jmpshortpespin1_.0040ED910040ED90C46681lesesp,fwordptrdsesi7F0040D8FB61popad

注意事项

本文(ESP定律.pdf)为本站会员(baixue100)主动上传,人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知人人文库网([email protected]),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。

copyright@ 2015-2017 人人文库网网站版权所有
苏ICP备12009002号-5