首页 > 其他分享 >逆向—堆栈

逆向—堆栈

时间:2023-01-09 14:57:21浏览次数:37  
标签:逆向 MOV DS DOWRD 堆栈 DWORD EDX PTR

假设我们需要一块内存,有如下的要求:

1、主要用于临时存储一些数据,如果数量很少就放到寄存器中

2、能够记录存了多少数据

3、能够非常快速的找到某个数据

我们可以这样来设计结构图:

 

 1、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址).

2、BASE里面存储了一个地址,记录的起始地址.

3、TOP里面也存储了一个地址,记录的是结束的地址.

4、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)

5、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)

6、如果要读取中间的某个数据的时候可以通过TOP 或者 BASE 加上偏移的方式去读取

7、这种内存的读写方式有个学名:堆栈

堆栈的优点:临时存储大量的数据,便于查找.

步骤一:压入数据

MOV EBX,13FFDC  BASE

MOV EDX,13FFDC  TOP

方式一:

MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA

SUB EDX,4

方式二:

SUB EDX,4

MOV DWORD PTR DS:[EDX],0xBBBBBBBB

方式三:

MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD

LEA EDX,DWORD PTR DS:[EDX-4]

方式四:

LEA EDX,DWORD PTR DS:[EDX-4]

MOV DWORD PTR DS:[EDX],0xEEEEEEEE

步骤二:读取第N个数

1、方式一:通过Base加偏移来读取

读第一个压入的数据:

MOV ESI,DWORD PTR DS:[EBX-4]

读第四个压入的数据:

MOV ESI,DWORD PTR DS:[EBX-0x10]

2、方式二:通过Top加偏移来读取

读第二个压入的数据:

MOV EDI,DWORD PTR DS:[EDX+4]

读第三个压入的数据:

MOV EDI,DWORD PTR DS:[EDX+8]

步骤三:弹出数据

MOV ECX,DWORD PTR DS:[EDX]

LEA EDX,DWORD PTR DS:[EDX+4]

 

MOV ESI,DWORD PTR DS:[EDX]

ADD EDX,4

 

LEA EDX,DWORD PTR DS:[EDX+4]

MOV EDI,DWORD PTR DS:[EDX-4]

 

本节练习:

1、使用EBX存储栈底地址,EDX存储栈顶地址,连续存储5个不同的数.

MOV EBX,13FFD8  栈底

MOV EDX,13FFD8  栈顶

SUB EDX,20

MOV DWORD PTR DS:[EDX+16],0xAAAAAAAA

MOV DOWRD PTR DS:[EDX+12],0xBBBBBBBB

MOV DOWRD PTR DS:[EDX+8],.0xCCCCCCCC

MOV DOWRD PTR DS:[EDX+4],0xDDDDDDDD

MOV DOWRD PTR DS:[EDX],0xEEEEEEEE

2、分别使用栈底加偏移、栈顶加偏移的方式读取这5个数,并存储到寄存器中.

MOV EAX,DOWRD PTR DS:[EDX+20]

MOV EAX,DOWRD PTR DS:[EDX+16]

MOV EAX,DOWRD PTR DS:[EDX+12]

MOV EAX,DOWRD PTR DS:[EDX+8]

MOV EAX,DOWRD PTR DS:[EDX+4]

 

 

MOV EAX,DOWRD PTR DS:[EBX]

MOV EAX,DOWRD PTR DS:[EBX-4]

MOV EAX,DOWRD PTR DS:[EBX-8]

MOV EAX,DOWRD PTR DS:[EBX-12]

MOV EAX,DOWRD PTR DS:[EBX-16]

3、弹出这5个数,恢复栈顶到原来的位置.

MOV ECX,DWORD PTR DS:[EDX]

LEA EDX,P=DOWRD PTR DS:[EDX+4]

MOV ESI,DOWRD PTR DS:[EDX]

ADD EAX,4

LEA EDX,DWORD PTR DS:[EDX+4]

MOV EDI,DWORD PTR DS:[EDX-4]

 

标签:逆向,MOV,DS,DOWRD,堆栈,DWORD,EDX,PTR
From: https://www.cnblogs.com/BDAMBXA/p/17037045.html

相关文章

  • 逆向-内存
    一、寄存器与内存的区别:        计算机内存的每一个字节会有一个编号(即内存编号的单位是字节),如下图:  32位计算机的编号最大是32位,也就是32个1换......
  • 记1次数据堆栈溢出
     从线上服务器已获取到堆栈文件,java_pid28439.hprof。一开始使用[fastThread](https://heaphero.io/ft-index.jsp)在线分析工具,或者[GCeasy](https://gceasy.io/index......
  • 逆向-通用寄存器
    32位通用寄存器的指定用途如下:      MOV的语法:r/m8,表示8位的寄存器或内存  MOV目标操作数,源操作数作用:拷贝源操作数到目标操作数1、源操作数可以是......
  • 逆向-数据宽度-逻辑运算
    数据宽度:1、数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃。2、4位宽度表......
  • 逆向-进制说明
     1、进制的定义十进制的定义:由十个符号组成,分别是0123456789逢十进一。九进制的定义:由九个符号组成,分别是012345678逢九进一。十六进制的定义:由十......
  • Go逆向总结
    一、介绍 Go语言是一个强类型静态语言,实现了CSP并发模型,并在2012年才发布首个稳定版。由于Go语言方便跨平台交叉编译,所以吸引了恶意软件开发者使用Go来开发恶意软件......
  • 网易云爬虫+逆向分析
    本人属于爬虫小白级别,历经重重困难终于有了点感觉,对于网易云音乐的爬虫,想为大家分享一下自己的思路,有不足的地方还望各位大佬指出。当然,目前无法下载无损音乐,也无法下载vi......
  • 记一次2022某地HVV中的逆向分析
    前言事情是这样的,国庆前期某地HVV,所以接到了客户通知他们收到了钓鱼邮件想要溯源直接下载文件逆向分析一波。钓鱼邮件,图标什么的做的还是挺逼真的,还真的挺容易中招的,但......
  • VC中自行构建Stack(堆栈)类
    template<classT>classStack{structLink{T*data;Link*next;Link(T*dat,Link*nxt):data(dat),next(nxt){}}*head;public:Stack():head(0){}~Stack......
  • 《安富莱嵌入式周报》第289期:开源回流焊,首发开源跨平台电路仿真软件,用于电气化学的电
    ​​​​ 视频版:​​https://www.bilibili.com/video/BV1ND4y187ps​​  1、开源回流焊主控Github:​​https://github.com/UnexpectedMaker/ReflowMaster​​网站介绍:​......