12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 346|回复: 0

逆向基础笔记四 堆栈篇

[复制链接]

52

主题

52

帖子

114

积分

实习版主

Rank: 7Rank: 7Rank: 7

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

堆栈是什么?

一块区域
用于:
临时存储一些数据,如果数量很少就放到寄存器中
堆栈必要具备的功能

可以或许记录存了多少数据
可以或许非常快速地找到某个数据
堆栈的优点

临时存储大量数据,便于查找
简易的堆栈模型



  • 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立即数r88位通用寄存器m88位内存imm88位立即数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取出堆栈

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-3-29 01:16 , Processed in 0.140625 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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