大神论坛

找回密码
快速注册
查看: 304 | 回复: 0

[语言编程类] 大神论坛 逆向脱壳分析基础学习笔记四 堆栈篇

主题

帖子

5

积分

初入江湖

UID
20
积分
5
精华
威望
10 点
违规
大神币
68 枚
注册时间
2021-03-14 10:40
发表于 2021-03-14 15:30
本帖最后由 kay2kay 于 2021-03-14 15:30 编辑

本文为本人的滴水逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出。
陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步


所有笔记链接:

大神论坛 逆向脱壳分析基础学习笔记一 进制篇
大神论坛 逆向脱壳分析基础学习笔记二 数据宽度和逻辑运算
大神论坛 逆向脱壳分析基础学习笔记三 通用寄存器和内存读写
大神论坛 逆向脱壳分析基础学习笔记四 堆栈篇
大神论坛 逆向脱壳分析基础学习笔记五 标志寄存器 
大神论坛 逆向脱壳分析基础学习笔记六 汇编跳转和比较指令
大神论坛 逆向脱壳分析基础学习笔记七 堆栈图(重点)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记八 反汇编分析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立即数
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取出堆栈


版权声明:本文由 lyl610abc 原创,欢迎分享本文,转载请保留出处

返回顶部