#include<stdio.h>
#include<windows.h> void Fun()
{
printf("Kali-Team\n");
} int check()
{
int arr[4] = {0,1,2,3};
arr[5] = (int)&Fun;
return 0;
} void main()
{
_asm{
mov eax,eax;
mov eax,eax;
}
check();
getchar();
return;
}
  • 调用check函数前先把004010F1(call下一条要执行的地址)压入堆栈中,当前的ESP为0012FF30,EBP为0012FF80,check函数的地址为00401005。F11单步跟进函数。
  • 因为压入了call下一步的返回地址,所以ESP减4变为0012FF2C,到下面的push原ebp到堆栈中,esp减4,mov将当前ebp改为esp后提升堆栈50h(十进制的80),再保存ebx,esi,edi三个寄存器的值到栈中,esp减12,最后四行为填充CC到缓冲区。
00401070 55                   push        ebp
00401071 8B EC mov ebp,esp
00401073 83 EC 50 sub esp,50h
00401076 53 push ebx
00401077 56 push esi
00401078 57 push edi
00401079 8D 7D B0 lea edi,[ebp-50h]
0040107C B9 14 00 00 00 mov ecx,14h
00401081 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401086 F3 AB rep stos dword ptr [edi]
  • 下面是给数组arr赋值,局部变量在堆栈中保存。
00401088 C7 45 F0 00 00 00 00 mov         dword ptr [ebp-10h],0
0040108F C7 45 F4 01 00 00 00 mov dword ptr [ebp-0Ch],1
00401096 C7 45 F8 02 00 00 00 mov dword ptr [ebp-8],2
0040109D C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
  • 关键代码继续给arr赋值,因为上面已经分配到ebp-4了,下标为4的很明显是越界了,就会覆盖到ebp
004010A4 C7 45 04 0A 10 40 00 mov         dword ptr [ebp+4],offset @ILT+5(Fun) (0040100a)
  • call的返回地址在EBP+4中,所以我们要将下标改为5,即为arr[5] = (int)&Fun;
004010AD 5F                   pop         edi
004010AE 5E pop esi
004010AF 5B pop ebx
004010B0 8B E5 mov esp,ebp
004010B2 5D pop ebp
004010B3 C3 ret
  • 在恢复寄存器后执行ret指令,将arr[5]的值给了EIP。

  • 现在就会把Check函数的返回地址改为Fun函数的开始地址,所以Fun会被执行。

0012FECC edi
0012FED0 esi
0012FED4 ebx
esp 0012FED8 提升堆栈后到了这里
0 Ebp-10
1 Ebp-C
2 Ebp-8
3 Ebp-4
ebp 0012FF28 保存原ebp 0012FF80
0012FF2C call下一步的返回地址
0012FF30
0012FF80

为什么Fun函数能够执行的更多相关文章

  1. android view 中各函数的执行顺数

    这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: pa ...

  2. $.getJSON('url',function(data){}) 中回调函数不执行

    $.getJSON('url',function(data){}) 中回调函数不执行 url 中的 json 格式不正确 ,浏览器返回并没有报错 {'湖北':[114.11438,30.849429] ...

  3. 全局对象的构造函数会在main 函数之前执行

    #include <iostream> using namespace std; class A { public: A() { cout << "Generator ...

  4. unity3D技术之事件函数的执行顺序[转]

    unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703   在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: ...

  5. Unity3D中自带事件函数的执行顺序(转)

    原文:http://www.jianshu.com/p/1d93ece664e2 在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(E ...

  6. Scala 中 构造函数,重载函数的执行顺序

    在调试scala在线开发教程(http://www.imobilebbs.com/wordpress/archives/4911)的过程中看到了以下代码,但是这段代码无论怎么调试都无法成功. abst ...

  7. Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序

    Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6. ...

  8. Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照

    原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...

  9. php利用wsh突破函数禁用执行命令(安全模式同理)

    php利用wsh突破函数禁用执行命令(安全模式同理) 前提.需要服务器支持wsh.并知道php安装目录 但是php利用wsh执行命令是没有asp的权限高的.   突破代码 <?php $cmd= ...

  10. js函数自执行

    在javascript里,任何function在执行的时候都会创建一个执行上下文,因为function声明的变量和function有可能只在该function内部,这个上下文,在调用function的 ...

随机推荐

  1. oracle用户密码忘记怎么修改

    安装完数据库很久不用常常会忘记其密码,碰到这种情况不要动不动就重装数据库,按其下方法修改即可. 一:忘记sys,system用户的密码 1,在开始菜单点击‘运行’,输入‘cmd’,打开命令提示窗口,输 ...

  2. 使用注解配置Servlet3.0

    从Servlet3.0开始支持使用注解来配置. 注解只是代替了一部分的web.xml的 配置,通常在针对单个Servlet的配置时(比如Servlet的资源名称)使用注解 web.xml:优势在于解决 ...

  3. 【PAT甲级】1056 Mice and Rice (25 分)

    题意: 输入两个正整数N和M(<=1000),接着输入两行,每行N个数,第一行为每只老鼠的重量,第二行为每只老鼠出战的顺序.输出它们的名次.(按照出战顺序每M只老鼠分为一组,剩余不足M只为一组, ...

  4. 「JSOI2014」歌剧表演

    「JSOI2014」歌剧表演 传送门 没想到吧我半夜切的 这道题应该算是 \(\text{JSOI2014}\) 里面比较简单的吧... 考虑用集合关系来表示分辨关系,具体地说就是我们把所有演员分成若 ...

  5. 「CQOI2009」中位数

    「CQOI2009」中位数 传送门 这道题将会用到一点桶的思想. 首先我们可以在排列中先找到 \(b\) 的位置(找不到的话就直接输出 \(0\)). 然后我们从 \(b\) 的位置(设为 \(p\) ...

  6. android 支持上拉加载,下拉刷新的列表控件SwipeRefreshLayout的二次封装

    上拉加载,下拉刷新的列表控件,大家一定都封装过,或者使用过 源代码,我会在最后贴出来 这篇代码主要是为了解决两个问题 1.滑动冲突得问题 2.listview无数据时,无数据布局的展示问题 下方列出的 ...

  7. ios 物流时间轴,自动匹配电话号码,可点击拨打

    http://www.code4app.com/thread-27587-1-1.html 资讯时间轴(折叠/展开) http://www.code4app.com/thread-32358-1-1. ...

  8. Python基础-4 运算符

    运算符 运算符:以1 + 2为例,1和2被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 ...

  9. C++ 判断是文件还是文件夹

    转载:https://www.csdn.net/gather_23/NtDaIg1sMDYtYmxvZwO0O0OO0O0O.html Windows平台代码如下: #include <wind ...

  10. 学习不一样的vue4:mock与axios实战1

    学习不一样的vue4:mock与axios实战1  发表于 2017-06-14 |  分类于 web前端|  |  阅读次数 8180 首先 首发博客: 我的博客 项目源码: 源码(喜欢请star) ...