C和汇编混合编程--------函数调用后ebp、esp值问题

今天老师又给了一个程序,让我们分析,记录一下分析过程
程序:

#include "stdio.h"
#include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";
void fun1(int a, int b)
{printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0};
strcpy(aa,shellcode);	
}
void fun2(int a)
{printf("fun2 run! para a=%d\n",a);}
void fun3(int a,int b,int c)
{printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c);
}
int main(int argc, char* argv[])
{printf("begin\n");fun1(1,2);printf("end\n");return 0;
}

结果:

fun2函数执行了,没有输出来end
在这里插入图片描述
首先我们来看看为什么fun2执行了,将程序反汇编
当执行完char aa[4]={0},我们发现0x0019fed0这个地址存放这个数据,此时我们看一下0x0019fed4和0x0019fed8内的数据
在这里插入图片描述
当执行完strcpy时,0x0019fed0到0x0019fed8存放的内容是shellcode的内容,为什么是这个数据,看这篇文章(https://blog.csdn.net/qq_41683305/article/details/104282462),继续往下执行
在这里插入图片描述
当执行到ret命令时,我们观察esp的值,发现存放的内容是00401005,这个是什么?我们找到fun2的地址
在这里插入图片描述
发现和fun2的地址一样,这就是为什么会执行fun2
在这里插入图片描述
为什么不会输出end呢?
下面继续分析,按照上面的继续执行,当执行到ret时,此时esp存放的数据是00000001,我们会到这个地址执行
在这里插入图片描述
00000001啥都不是,所以不会执行end
在这里插入图片描述
下面来解决问题
现在我们来理一理思路,程序先执行fun1,然后去执行fun2,然后到00000001执行,没有返回来,我们要注意,00000001是我们程序fun1(1,2)中的1,所以我们将1改成我们要fun2执行完跳转的地址,就可以继续执行了,这个地址就是下图中的地址,跳转到这里继续执行
在这里插入图片描述
我们来改一下,程序:

#include "stdio.h"
#include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";
void fun1(int a, int b)
{printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0};
strcpy(aa,shellcode);	
}
void fun2(int a)
{printf("fun2 run! para a=%d\n",a);}
void fun3(int a,int b,int c)
{printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c);
}
int main(int argc, char* argv[])
{printf("begin\n");fun1(0x401191,2);printf("end\n");return 0;
}

在这里插入图片描述
我们可以看到fun1里填的0x401191不是0x40118e,这是1和0x401191和所占的字节不同导致的

继续报错,提示堆栈没有平衡,继续分析
我们分析一下,当调用fun1函数前,esp的值如图
在这里插入图片描述
fun2执行完,执行完下图的add esp,8时,esp的值为

在这里插入图片描述

在这里插入图片描述
本应该执行完add esp,8,esp的值应该是调用fun1函数前的值,结果差了4,找到原因了,补上:

#include "stdio.h"
#include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";
void fun1(int a, int b)
{printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0};
strcpy(aa,shellcode);	
}
void fun2(int a)
{printf("fun2 run! para a=%d\n",a);}
void fun3(int a,int b,int c)
{printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c);
}
int main(int argc, char* argv[])
{printf("begin\n");fun1(0x401191,2);__asm{sub esp,4}printf("end\n");return 0;
}

在这里插入图片描述
栈都平衡了,为什么还会报错呢,这就和检查有没有平衡栈的机制有关了

ebp存放的是调用函数前的esp,函数调用最后需要平衡栈数据,也就是将esp还原成调用函数前的esp,如果比较ebp和esp相等就不报错

没错还和ebp有关,在执行strcpy时,把原来的ebp内容修改了,所以会报错,继续改,还原原来的ebp

#include "stdio.h"
#include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00";
void fun1(int a, int b)
{printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0};
strcpy(aa,shellcode);	
}
void fun2(int a)
{printf("fun2 run! para a=%d\n",a);}
void fun3(int a,int b,int c)
{printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c);
}
int main(int argc, char* argv[])
{printf("begin\n");fun1(0x401191,2);__asm{sub esp,4mov ebp,0x19ff30}printf("end\n");return 0;
}

执行,完美解决问题
在这里插入图片描述
总结:

  • 检查栈有没有平衡,是根据ebp和esp的值,有一个修改都要还原
  • ebp存放的是调用函数前的esp,函数调用最后需要平衡栈数据,也就是将esp还原成调用函数前的esp,如果比较ebp和esp相等就不报错,就是下图这两条语句检查的
    在这里插入图片描述
  • esp和ebp的值最后要相同

中间涉及esp和ebp的值变换,没有写了,反汇编调试注意一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android游戏黑屏,第五人格游戏进不去黑屏解决办法

小编今天给各位玩家朋友们带来的是第五人格游戏进不去黑屏解决办法,很多的玩家朋友们在第五人格更新后都出现了黑屏、游戏无法进入等情况,这应该怎么办呢?小编把解决方法给大家整理在了下方,感兴趣的小伙伴们快来跟小编一起往下看…

线性表----顺序表

线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列, 逻辑特性 除第一个元素外,每个元素只有一个前驱,除最后一个元素外,每个元素都有一个后继 物理结构 线性表的存储结构有顺序存储结构和链式存储结构&#xff…

树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

树、二叉树、二叉搜索树Description: 描述: This article describes how to check whether a given tree is BST or not? This problem came in coding round of Microsoft. 本文介绍如何检查给定的树是否是BST ? 这个问题来自微软的编码回合。 Probl…

栈溢出利用-----jmp esp

通过jmp esp利用栈溢出&#xff0c;首先我们要找出jmp esp 的地址&#xff0c;因为系统不同&#xff0c;通用jmp esp的地址可能不同&#xff0c;下面的代码是找出jmp esp的地址的&#xff1a; #include<windows.h> #include<iostream.h>#include<tchar.h> i…

android 队列上传图片,话说android端七牛图片上传

七牛图片上传业务流程如下图(这是官方的图)&#xff1a;由上图可知&#xff0c;要想实现图片上传&#xff0c;是要三端进行交互的(我刚刚开始以为只要七牛服务器跟客户端交互就行)接下来步骤如下&#xff1a;1、首先肯定是要有一个七牛的账号&#xff0c;并创建一个空间2、客户…

bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)

bst 删除节点Problem statement: C program to find number of binary search trees with n nodes. 问题陈述&#xff1a; C 程序查找具有n个节点的二进制搜索树的数量。 Input format: single integer n 输入格式&#xff1a;单整数n Constraints: 0<n<15 约束&#x…

android intent实验,Android开发课程实验报告③ intent的使用

Android开发课程实验报告author&#xff1a;065实验四&#xff1a;intent实验报告目录实验目的初学移动应用公开发中的Android开发&#xff0c;实验四的主要内容为intent的使用&#xff0c;通过这一次实验&#xff0c;掌握基本的intent使用方法。具体实验分析实验第一步&#x…

利用xor给shellcode加壳

首先看我们的shellcode&#xff0c;执行弹出cmd 没有shellcode&#xff1a; #include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTAN…

华为mate50鸿蒙,华为Mate50Pro首次曝光,5000mAh+鸿蒙OS+120Hz,太强

自从去年九月份以来&#xff0c;关于华为旗舰的消息越来越少了&#xff0c;主要的原因想必大家也是知道的。现在华为究竟还能不能继续正常发布新旗舰&#xff0c;答案也很微妙&#xff0c;不过我们可以肯定的是&#xff0c;华为绝不会放弃手机业务&#xff0c;这是余承东多次亲…

数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块&#xff0c;如下图所示&#xff1a; 因为木块堆得实在是太有规律了&#xff0c;你只要知道它的层数就可以计算所有木块的数量了。 现在请你写个程序 给你任一堆木块的层数&#xff0c;求出这堆木块的数量. 输入 第一行是一个整…

信息安全主动攻击和被动攻击_信息安全中的主动和被动攻击 网络安全

信息安全主动攻击和被动攻击安全攻击 (Security Attacks) The attack in cryptography means that our data or sent messages or any kind of information is accessed by some anonymous user without our permission. An attack simply means to alter, destroy, implant or…

线性表---双链表

双链表是单链表的拓展&#xff0c;单链表结点中只有一个指向其后继的指针&#xff0c;双链表有两个结点&#xff0c;一个指向其后继的指针&#xff0c;另一个指向前驱。 为什么要引入双链表呢&#xff1f; 这就要说单链表只有一个指针了&#xff0c;使得单链表只能从结点依次顺…

ppt形状html,PPT如何才能高大上?“形状”在PPT有这些妙用

【PConline 技巧】在PPT中&#xff0c;形状的用法非常丰富。可以说一份优秀的PPT&#xff0c;随处都能见到形状的影子。今天我们就和大家分享几组形状的特殊用法。其实很多时候&#xff0c;你会发现形状有时并不仅仅是形状&#xff01;1.突出标题标题在PPT中的作用不言而喻&…

二分图匹配----匈牙利算法之二

poj 1469 COURSES//题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表,//现给出每门课程都有哪些学生可以参加,要求判断是否存在满足题意所需要的组织.//求解二分图的最大匹配数,如果与p相等就输出&qu…

FileSystemObject简介及应用

提示:刚一开始看到有这样的功能&#xff0c;我也受骗了&#xff0c;以为真的可以通过浏览器在访问者的硬盘上创建文件&#xff0c;因为我开始试了一下真的可以&#xff0c;不信你把下面这段代码COPY到一个HTML文件当中再运行一下&#xff01; <script language"JavaScr…

线性表----循环链表和静态链表

1、循环链表 1.1 循环单链表 循环单链表和单链表的区别在于&#xff0c;表中最后一个结点指针不在是null&#xff0c;而是头指针&#xff0c;从而使整个链表形成一个环 此时判断单链表是否为空&#xff0c;条件就是头结点的指针是否等于头指针此时单链表相当于一个环&#…

利用kali的msf提取汇编机器码(shellcode)

对于提取小段汇编的机器码&#xff0c;kali的msf提取汇编机器码非常方便 比如提取下面小段的汇编机器码 push 5 ;5SW_SHOWpush eaxmov eax,0x755bdab0call eax首先输入 msf-nasm_shell //注意msf和-之间没有空格然后依次输入命令 将上面内容复制到一个文本编辑器里&#x…

线性表------栈

1、基本概念 栈&#xff1a;只允许在一端插入或删除操作的线性表栈底&#xff08;buttom&#xff09;&#xff1a;固定的&#xff0c;不允许进行插入和删除操作的另一端栈顶&#xff08;top&#xff09;&#xff1a;线性表允许插入和删除的一段 栈是线性表&#xff0c;只不过受…

无线网络覆盖

描述 我们的乐乐同学对于网络可算得上是情有独钟&#xff0c;他有一个计划&#xff0c;那就是用无线网覆盖郑州大学。 现在学校给了他一个机会&#xff0c;因此他要购买很多的无线路由。现在他正在部署某条大道的网络&#xff0c;而学校只允许把他的无线路由器放在路的正中间…

旧计算机 云桌面,该不该利用旧PC机改造成云桌面虚拟化模式呢?

原标题&#xff1a;该不该利用旧PC机改造成云桌面虚拟化模式呢&#xff1f;由于传统PC电脑办公模式有数据安全隐患、维护成本高、占用空间及耗电量高&#xff0c;噪音大&#xff0c;使用寿命低等弊端正在逐步退出办公领域&#xff0c;越来越多的企业选择桌面虚拟化办公模式。那…