汇编达人视频学习7(拓展课:外挂是什么、ESP寻址、EBP寻址、ESP传参的弊端)


title: 汇编达人视频学习7(拓展课:外挂是什么、ESP寻址、EBP寻址、ESP传参的弊端)
date: 2021年8月4日 17点17分
tags: 汇编达人
categories: 汇编达人

24、外挂的本质

1、修改内存中的值

2、调用它的某个函数

25、ESP寻址

1、寄存器传参

函数:

mov eax,ecx

add eax,edx

ret

调用函数:

mov ecx,1

mov edx,2

call 0x地址

在这里插入图片描述

2、堆栈传参

当要传递的参数太多,寄存器不够用的时候,就要使用堆栈的方式,进行传参。

push 1

push 2

call 0x地址

0x地址:mov eax,dword ptr ss:【ESP + 4】

​ add eax,dword ptr ss:【ESP + 8】

​ ret

这就是通过ESP来达到找到参数或者变量的目的

3、ESP寻址的弊端

ESP是指向当前栈顶的,当用堆栈来传参或者临时存储一些值的时候,栈顶就会变化,当下面继续使用ESP的值去寻找原来的参数或者变量的时候,就要先修正这个变化,不修正的话,找到的值就是错的,或者如果存入的值太多,导致ESP变化很大,需要多次修改,这就很不好操作,这就是ESP寻址的弊端

push 1

push 2

call 0x地址

0x地址:

push ecx

push ebx

push edx

mov ecx,dword ptr ss:【ESP + 10】 //取得第二个参数

add ecx,dword ptr ss:【ESP + 14】 //取得第一个参数

mov eax,ecx

pop edx

pop ebx

pop ecx //栈,后进先出

ret

多了一堆push pop是方便ecx,ebx等寄存器的使用与恢复。

当你需要用到ecx,ebx,edx等寄存器的值的时候,就需要将它们的值存入到堆栈中,push eax ,push ecx等,为什么要存呢?因为函数可能要用到寄存器的值,当函数执行完了之后,寄存器的值可能会丢失。但是后边的程序可能需要用到ecx的值,但是被改了,或者丢失了,程序就坏了。

26、EBP寻址

EBP指向的是栈底。

在这里插入图片描述

push 1

push 2

call 0x地址

0x地址:

push ebp //保留原来ebp的值

mov ebp,esp //让ebp指向esp的地址

sub esp,0x10(16个字节) //提升当前堆栈空间,让esp向上移动,这时就有一块自己定义的堆栈空间随意使用

这段代码执行完之后,ebp、esp的变化如图:

在这里插入图片描述

这种情况下,如果有影响堆栈的操作的话,改变的是esp的值,而我ebp的值是相对保持不变的。我们就可以通过ebp来寻找其他参数或者变量,就不用多次修改esp的值。

继续上边的代码:

mov eax,dword ptr ss:【ebp + 8】 //取到第二个参数的值

add eax,dword ptr ss:【ebp + c】 //取到第一个参数的值

mov esp,ebp //把esp之前的栈顶的位置,还回去

pop ebp //把之前ebp栈底的地址取出来,放到ebp里

ret 8 //因为上面push 1 ,push 2的时候,改变了堆栈栈顶的地址,或者使用外平栈的方式来恢复。

这样,现在的栈底和栈顶所指向的位置就跟函数执行之前一样,也就是堆栈平衡了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值