吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9442|回复: 39
收起左侧

[调试逆向] 逆向基础笔记四 堆栈篇

  [复制链接]
lyl610abc 发表于 2021-2-27 23:22
本帖最后由 lyl610abc 于 2021-3-13 20:44 编辑

继续更新个人的学习笔记,
其它笔记传送门
逆向基础笔记一 进制篇
逆向基础笔记二 数据宽度和逻辑运算
逆向基础笔记三 通用寄存器和内存读写
逆向基础笔记五 标志寄存器
逆向基础笔记六 汇编跳转和比较指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析C语言
逆向基础笔记九 C语言内联汇编和调用协定
逆向基础笔记十 汇编寻找C程序入口
逆向基础笔记十一 汇编C语言基本类型
逆向基础笔记十二 汇编 全局和局部 变量
逆向基础笔记十三 汇编C语言类型转换
逆向基础笔记十四 汇编嵌套if else
逆向基础笔记十五 汇编比较三种循环
逆向基础笔记十六 汇编一维数组
逆向基础笔记十七 汇编二维数组 位移 乘法
逆向基础笔记十八 汇编 结构体和内存对齐
逆向基础笔记十九 汇编switch比较if else
逆向基础笔记二十 汇编 指针(一)
逆向基础笔记二十一 汇编 指针(二)
逆向基础笔记二十二 汇编 指针(三)
逆向基础笔记二十三 汇编 指针(四)
逆向基础笔记二十四 汇编 指针(五) 系列完结

堆栈

堆栈是什么?

一块区域

用于:

临时存储一些数据,如果数量很少就放到寄存器中

堆栈需要具备的功能

能够记录存了多少数据

能够非常快速地找到某个数据

堆栈的优点

临时存储大量数据,便于查找

简易的堆栈模型

image-20210227170510647

  • BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址).
  • BASE里面存储了一个地址,记录的起始地址.
  • TOP里面也存储了一个地址,记录的是结束的地址.
  • 存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)
  • 释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)
  • 如果要读取中间的某个数据的时候可以通过TOP  或者 BASE 加上偏移的方式去读取
  • 这种内存的读写方式有个学名:堆栈

自己模拟一个堆栈

指定栈底和栈顶

Windows分配栈时 是从高地址往低地址分配

MOV EBX,0x13FFDC        BASE

MOV EDX,0x13FFDC        TOP

栈底和栈顶可以是两个任意的寄存器(Windows采用的是EBP和ESP)

刚开始堆栈为空,栈顶和栈底相同

将数据写入堆栈(入栈)

先将数据压入后再修改栈顶
数据压入

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

修改栈顶

SUB EDX,4

先修改栈顶后再将数据压入
修改栈顶

LEA EDX,DWORD PTR DS:[EDX-4]  (和上面的SUB一样)

数据压入

MOV DOWRD PTR DS:[EDX],0xAAAAAAAA

读取堆栈中的内容

栈顶加偏移读取

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

栈底加偏移读取

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

将数据弹出堆栈(出栈)

先取出数据再修改栈顶
取出数据

MOV EAX,DOWRD PTR DS:[EDX]

修改栈顶

ADD EDX,4

先修改栈顶再取出数据
修改栈顶

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

取出数据

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

WINDOWS的堆栈的操作

上面我们自己模拟的两个用作栈顶和栈底的寄存器在WINDOWS中分别对应ESP和EBP

并且前面我们自己模拟的入栈和出栈操作也有对应的指令:PUSH 和 POP

就是封装了压入数据和修改栈顶的操作

push xxx将 xxx的数据压入堆栈

pop xxx将栈顶的数据存储到xxx中

堆栈相关汇编指令

符号 含义
r 寄存器
m 内存
imm 立即数
r8 8位通用寄存器
m8 8位内存
imm8 8位立即数
PUSH指令

PUSH r32

PUSH r16

PUSH m16

PUSH m32

PUSH  imm8/imm16/imm32

所有的push都是将esp-4?

不是,要分情况,看压入的数据的数据宽度

当push的是立即数将esp-4

当push r32如push eax时将esp-4

当push dword ptr ds:[12FFDA]即压入双字内存地址中的数据时将esp-4

当push word ptr ds:[12FFDA]即压入字内存地址中的数据时将esp-2

当push ax,即r16 ,16位通用寄存器时,esp-2

push 不允许压入数据宽度为8的数据 如ah al 和byte ptr ds:[内存编号]

POP指令

POP r32

POP r16

POP m16

POP m32

PUSHAD和POPAD指令

将所有的32位通用寄存器压入堆栈,方便后面随意使用寄存器,用于保护现场

与POPAD对应

PUSHFD和POPFD指令

然后将32位标志寄存器EFLAGS压入堆栈

与POPAD对应

其它相关指令

pusha:将所有的16位通用寄存器压入堆栈

popa:将所有的16位通用寄存器取出堆栈

pushf::将的16位标志寄存器EFLAGS压入堆栈

popf:将16位标志寄存器EFLAGS取出堆栈

免费评分

参与人数 11吾爱币 +11 热心值 +10 收起 理由
fanfei + 1 + 1 谢谢@Thanks!
zxbfy021105 + 1 + 1 热心回复!
国际豆哥 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
oyjy + 1 + 1 感谢感谢
Nasilap + 1 + 1 我很赞同!
KingXL + 1 谢谢@Thanks!
zjs3.13 + 1 + 1 热心回复!
By阿清 + 1 + 1 我很赞同!
pwzx + 1 + 1 我很赞同!
secretme + 1 我很赞同!
朱朱你堕落了 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

aswcy815174418 发表于 2021-3-5 08:35
PUSHAD和POPAD指令
将所有的32位通用寄存器压入堆栈,方面后面随意使用寄存器,用于保护现场

与POPAD对应

有错别字:方面->方便
要么就是我想错了

免费评分

参与人数 1热心值 +1 收起 理由
lyl610abc + 1 感谢您的宝贵建议,我们会努力争取做得更好!

查看全部评分

marlborogolo 发表于 2021-2-28 01:47
PrincessSnow 发表于 2021-2-28 03:53
YolenS 发表于 2021-2-28 11:55
学到了,之前堆栈总是不清晰。
Yusica 发表于 2021-2-28 12:20
谢谢楼主分享
如意不如意 发表于 2021-2-28 12:29

谢谢楼主分享
zjs3.13 发表于 2021-2-28 12:44
谢谢,学到了不少
PikachuKing 发表于 2021-2-28 13:01
谢谢大佬分享
莎莎啦啦 发表于 2021-2-28 13:02
楼主笔记很及时
fubuki 发表于 2021-2-28 13:12
支持一下,很有启发
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-4 01:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表