脱壳实践之寻找OEP——堆栈平衡法

摘要:
0x00前面的介绍介绍了shell程序的加载过程,并通过两次内存断点方法查找OEP。在本文中,我们将使用一种新的方法堆栈平衡方法来查找OEP。在脱壳过程中,可以根据堆栈平衡原理断开ESP以找到OEP。0x02示例说明了堆栈平衡原理。查找OEP1.)将PE文件RebPE拖到OD中,程序停止,如下图所示:我们按F8在一个步骤中执行一次,如下图中所示。如上图所示,第一步是执行pushad操作,即保存堆栈中每个寄存器的值。)寄存器窗口中保存的值为0019FF64。右键单击以在数据窗口中跟随,并在那里设置硬件断点。

 0x00 前言

  上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP

0x01 堆栈平衡法原理

  堆栈平衡原理就是利用壳程序在运行前后需要保存和恢复原程序的堆栈环境来实现的。我们可以把壳程序当作一个子程序,调用这个子程序前,肯定需要保存原程序的堆栈环境,子程序调用完毕之后,就需要pop处原堆栈的值从而实现堆栈平衡。通常来说,壳程序使用pushhad/pophad或者pushfd/popfd指令来实现。脱壳时可以实根据堆栈平衡原理对ESP下断(由于esp存储的是栈顶指针),找到OEP

0x02 实例讲解堆栈平衡原理找OEP

1)PE文件RebPE拖入OD,程序停处,如下图:

脱壳实践之寻找OEP——堆栈平衡法第1张

 我们按F8单步执行一次,得下图:

脱壳实践之寻找OEP——堆栈平衡法第2张

 上图可知,第一步执行的是pushad操作,就是把各个寄存器的值保存在堆栈中)在寄存器窗口得到保存的值为0019FF64,我们右键在数据窗口跟随,并在该处下硬件断点。如下图:

脱壳实践之寻找OEP——堆栈平衡法第3张

脱壳实践之寻找OEP——堆栈平衡法第4张 

2)F9运行,该程序在刚刚的断点处停止(PS:我们刚刚下的数据断点是ESP寄存器的值,既然要壳程序运行结束要恢复数据就一定会访问这里,恢复完数据即马上就要到了OEP处)。

脱壳实践之寻找OEP——堆栈平衡法第5张

 3)我们注意到前面已经执行了popad指令,后面两句指令 push 0x401130 retn其实就是相当于jmp 0x401130,即跳转至401130处,这个地址就是OEP 。我们继续F8单步,程序来到此处如下图:

脱壳实践之寻找OEP——堆栈平衡法第6张

 这个401130就是原程序起始地址。我们将od的分析去掉可以很直观的看出来,如下图:

脱壳实践之寻找OEP——堆栈平衡法第7张

免责声明:文章转载自《脱壳实践之寻找OEP——堆栈平衡法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springmvc 双亲上下文导致的 No mapping found for HTTP requestMySQL(一) 数据表数据库的基本操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GDB调试器

/*this project used for gdb debug c programs*//*At first,using compile command turn out the executable file. exp: gcc -g sourcefile.c -o test.exe */        //!!!/*windows: start g...

调试lua代码

lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样: 【例子程序】 -- debug.luagvar1 = 100 function foo() local var2 = 10 function bar()...

Linux 系统中堆栈的使用方法

本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式。这部分内容的说明与内核代码关系比较密切,可以先跳过。在开始阅读相应代码时再回来仔细研究。 Linux 0.12系统中共使用了4种堆栈。第1种是系统引导初始化时临时使用的堆栈;第2种是进入保护模式之后提供内核程序初始化使用的堆栈,位于内核代码地址空间固定位置处。该堆栈也是后来任务...

Fiddler的详细介绍

Fiddler的详细介绍 一、Fiddler与其他抓包工具的区别 1、Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大。模拟http请求的功能也不够,且firebug常常是需要“无刷新修改”,如果刷新了页面,所有的修改都不会保存; 2、Wireshark是通用的抓包工具,能获取HTTP,也能获取HTT...

实现对第三方应用任意SO注入

实现对第三方应用任意SO注入 0x01 应用在Android中运行,从外部对该进程可以进行任意SO文件动态注入,就是应用动态运行我们的SO文件 0x02 基本的逻辑是: 1.    获取目标进程的pid,关联目标进程:通过遍历查找/proc/pid/cmdline文件中是否含有目标进程名process_name,若有则进程名对应的进程号即为pid。接着,直...

C#调试器导航

本快速入门演示如何在 Visual Studio 调试会话中导航,以及如何在会话中查看和更改程序状态。 本 快速入门适用于不熟悉用 Visual Studio 进行调试的开发人员,以及要详细了解在 Visual Studio 调试会话中导航的开发人员。但其中不传授调试本身的技艺。示例代码中的方法仅为演示本主题中所述的调试过程。这些方法并未采用应用程序或函...