本帖最后由 kay2kay 于 2021-03-14 15:30 编辑
本文为本人的滴水逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出。 陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步 所有笔记链接:
大神论坛 逆向脱壳分析基础学习笔记一 进制篇 大神论坛 逆向脱壳分析基础学习笔记二 数据宽度和逻辑运算 大神论坛 逆向脱壳分析基础学习笔记三 通用寄存器和内存读写 大神论坛 逆向脱壳分析基础学习笔记四 堆栈篇 大神论坛 逆向脱壳分析基础学习笔记五 标志寄存器 大神论坛 逆向脱壳分析基础学习笔记六 汇编跳转和比较指令 大神论坛 逆向脱壳分析基础学习笔记七 堆栈图(重点)(需登录才能访问) 大神论坛 逆向脱壳分析基础学习笔记八 反汇编分析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 | 立即数 | 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取出堆栈
版权声明:本文由 lyl610abc 原创,欢迎分享本文,转载请保留出处
|