继续更新个人的学习笔记,
其它笔记传送门
逆向基础笔记一 进制篇
逆向基础笔记二 数据宽度和逻辑运算
逆向基础笔记三 通用寄存器和内存读写
逆向基础笔记五 标记寄存器
逆向基础笔记六 汇编跳转和比力指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |