社区
汇编语言
帖子详情
关于ebp esp有的一点小疑问
Nynia
2012-05-21 10:27:24
子程序开头是这样的
push ebp
move ebp,esp
sub esp,4
这样运行时没有问题,但我改成
push ebp
sub esp,4
move ebp,esp
仅仅是掉个顺序,就会有问题
这是为什么呢
...全文
204
13
打赏
收藏
关于ebp esp有的一点小疑问
子程序开头是这样的 push ebp move ebp,esp sub esp,4 这样运行时没有问题,但我改成 push ebp sub esp,4 move ebp,esp 仅仅是掉个顺序,就会有问题 这是为什么呢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Nynia
2012-05-25
打赏
举报
回复
感谢各位大神,我基本是明白了
就是说我这样用,虽然不符合习惯,但本身没什么大问题,只要我明白ebp究竟指的是哪,能正确引用指针就行。
Lactoferrin
2012-05-25
打赏
举报
回复
push ebp
mov ebp,esp
sub esp,4
leave
push ebp
sub esp,4
mov ebp,esp
leave
分别运行这两个,然后看看寄存器的值是什么
gsy999
2012-05-24
打赏
举报
回复
[Quote=引用 10 楼 的回复:]
上面写错了,纠正一下
(1)你为什么要:
push ebp
mov ebp,esp
sub esp,4
(2)你为什么又要改成
push ebp
sub esp,4
move ebp,esp
(3)谁说的不能用第2种?完全可以用!!!问题的核心是:你用了第(2)方法进来以后,你接下来的程序是不是跟着变了?最根子的东西,你是不是完全懂了用堆栈传递参数的方法,如果你看……
[/Quote]
gsy999
2012-05-24
打赏
举报
回复
[Quote=引用楼主 的回复:]
(1)你为什么要:
push ebp
mov ebp,esp
sub esp,4
(2)你为什么又要改成
push ebp
mov ebp,esp
sub esp,4
(3)
谁说的不能用第2种?完全可以用!!!问题的核心是:你用了第(2)方法进来以后,你接下来的程序是不是跟着变了?最根子的东西,你是不是完全懂了用堆栈传递参数的方法,如果你看不出第(2)与第(1)有什么不同,说了也白搭。
fortitan
2012-05-24
打赏
举报
回复
栈是平衡的,
只不过函数里面在引用栈上传送来变量是基于你设定的这个EBP的,所以EBP不对,就引不用到正确的变量了
shayla
2012-05-24
打赏
举报
回复
ret 时,esp会加4是为了pop进入函数时压入的eip。
jack_jk
2012-05-23
打赏
举报
回复
这里用到了ebp,因为我们无法用esp做指针,因为esp随时可能变化的,所以用ebp做指针。代码:
push ebp ;将ebp的值入栈
move ebp,esp ;把esp的值给ebp,让ebp当做指针
sub esp,4 ;这里就改变了esp,esp-4就是将栈顶指针向上移动,预留出空间来给局部变量
所以,你先修改了esp,然后又把值付给ebp做指针当然是错误了。
这里push和pop是会不对称出现的,因为就用ebp的值不变来保持了堆栈平衡。
Nynia
2012-05-23
打赏
举报
回复
ebp 不就是一个指针么,指向esp或者esp-4有什么区别呢,只要我用的时候知道真正指的哪不就行了[Quote=引用 6 楼 的回复:]
这里用到了ebp,因为我们无法用esp做指针,因为esp随时可能变化的,所以用ebp做指针。代码:
push ebp ;将ebp的值入栈
move ebp,esp ;把esp的值给ebp,让ebp当做指针
sub esp,4 ;这里就改变了esp,esp-4就是将栈顶指针向上移动,预留出空间来给局部变量
所以,你先修改了esp,然后又把值付给ebp做……
[/Quote]
zara
2012-05-21
打赏
举报
回复
[Quote=引用 2 楼 的回复:]现在堆栈应该是平衡的吧,因为我程序末是有 leave 的,不是相当于 add esp ,4 pop ebp么[/Quote]
太高看 leave 的智能程度了吧。它的功能只是 mov esp, ebp 然后 pop ebp 并没有去分析你在子程开始处对 esp 进行了什么样的特殊处理而再相应的进行平衡的。还是在 ret 指令上设个断点看看 esp 的内容和指向处的内容吧,与进入子程时的比较下。空说是没有太大的意义的。
Nynia
2012-05-21
打赏
举报
回复
ebp 的值难道不能变么,我最后不是pop ebp了么[Quote=引用 3 楼 的回复:]
顺序改了之后 EBP的值不是变了么
[/Quote]
Himajesty
2012-05-21
打赏
举报
回复
顺序改了之后 EBP的值不是变了么
Nynia
2012-05-21
打赏
举报
回复
现在堆栈应该是平衡的吧,因为我程序末是有 leave 的,不是相当于 add esp ,4 pop ebp么
[Quote=引用 1 楼 的回复:]
看到子程的末尾的
mov esp, ebp
pop ebp
ret
了没?这里也要对应着改啊,不然你 sub esp, 4 不就堆栈不平衡了么。还不明白的话,在子程开始时记下来 esp 的内容,再在子程最后那里比较下。
[/Quote]
zara
2012-05-21
打赏
举报
回复
看到子程的末尾的
mov esp, ebp
pop ebp
ret
了没?这里也要对应着改啊,不然你 sub esp, 4 不就堆栈不平衡了么。还不明白的话,在子程开始时记下来 esp 的内容,再在子程最后那里比较下。
C语言之函数栈帧
!!!非常重要 以前我们知道在调用函数的时候会有寄存器来执行一些操作,常见的有
ebp
、
esp
、eax、ebx、ecx等 而在函数调用过程中也会调用两个寄存器,一个是
ebp
,一个是
esp
。
ebp
指向的是栈底,
esp
指向的是栈顶。 我们那下面这个例子来分析函数调用过程的具体细节: #include <stdio.h> int Add(int x, int y) { int ret =...
程序是怎么运行的?
程序是怎么运行的? 也许我们习惯了在IDE环境中敲代码、执行程序,只需一个键就能完成从编译、汇编、链接到显示结果的所有工作。。 那么你有没有疑惑过,当你执行一个简单的C程序时,它内部到底发生了什么呢?下面我们就从汇编语言的层面上来分析一下程序运行的全过程。 假设我写了一个简单的a+b的程序: 接下来我把它...
编译器1
第一部分:变量的内存分配 在介绍之前,先说明一下CPU的寄存器,我的计算机是64位的,但是为了方便,所以编译的程序是32位的,而且使用的32位调试器来进行分析的。这里简单介绍一下常用的寄存器。 32位平台常用的CPU寄存器如下:EAXECXEDXEBX //前面四个寄存器通常是存放临时数据
ESP
//
ESP
是非常关键的一个寄存器,它的作用是记录栈顶的内存地址
EBP
//在VC编译器编译出来的程序...
C++常用异常处理以及原理解析
C++常用异常处理以及原理解析 C++中异常机制的实现机制详解 函数的调用和返回 要理解C++异常机制实现之前,首先要了解一个函数的调用和返回机制,这里面就要涉及到
ESP
和
EBP
寄存器。我们先看一下函数调用和返回的流程: 下面是按调用约定__stdcall调用函数test(intp1,intp2)的汇编代码 假设执行函数前堆栈指针
ESP
为NN pushp2;参数2入栈,
ESP
-=4h,
ESP
=NN-4h pushp1;参数1入栈,
ESP
-=4h...
[BUUCTF]-PWN:ciscn_2019_es_2解析(栈迁移)
答:先说明
一点
,我们第二次构造payload时往
ebp
填入
ebp
-0x38是为了让它在执行完函数原有的leave,ret之后
ebp
指向b'a'*4的头地址,但要注意这里不是输入
ebp
-0x28,因为第一个printf打印出来的是
ebp
里的内容而不是
ebp
的地址,通过动态调试可以知道
ebp
里面的内容是
ebp
+0x10的地址,我们打印出来的就是
ebp
+10的地址,这里就要填入
ebp
-0x38才能使
ebp
指向b'a'*4的头。答:首先要明白32位是通过栈传参的,这样的形式是32位的调用函数的调用规则。
汇编语言
21,459
社区成员
41,601
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章