【reverse】逆向4 初识堆栈

1、问题引入

假设我们需要一块内存,有如下的要求

  1. 主要用于临时存储一些数据(如果数据很少可以放入寄存器中)
  2. 能够记录存了多少数据
  3. 能够非常快速的找到某个数据

2、模拟堆栈

我们可以设计这样的结构图

top:栈顶

base:栈底

windows操作系统分配堆栈是从高地址向低地址分配

为了统一,我们也这样模拟

压入数据

第一种添加数据的方式(先存数据再改地址)

我们将ebx作为栈底,edx作为栈顶,内存编号都位0x19FF78

将AAAAAAAA数据存入栈中之后,将edx的内存编号减去4

可以看到0019FF74内存编号的数据已经改为了AAAAAAAA

第二种添加数据的方式(先改地址再存数据)

我们先把edx的地址减去4,用lea的方式

然后再给edx地址存入数据BBBBBBBB

可以看到0019FF70内存编号的数据已经改为了BBBBBBBB

弹出数据

第一种弹出数据的方式(先取数据再改地址)

我们把栈顶edx的数据取出到eax中

然后再让edx的地址加4

可以看到eax中存入了BBBBBBBB这个数据

第二种弹出数据的方式(先改地址再取数据)

先让edx的地址加4,再从edx-4的地址中取出数据

可以的看到eax中存入了AAAAAAAA这个数据

3、堆栈

在cpu中,有两个寄存器,ebp、esp

我们使用操作系统时,操作系统将ebp当作栈底,esp当作栈顶

汇编语言给我们封装好了push和pop指令

我们push两个数据进去,esp的地址减少了8,并且在堆栈窗口可以看到我们push的两个值

同时可以看到我们的esp到了0019FF6C也就是存储12345678数值的地址

我们再执行

可以看到eax和ecx的值都改变了

同时esp的位置也加了8,因为pop了两个值

push

不允许push 8位寄存器

push 16位寄存器,esp地址-2

push 32位寄存器,esp地址-4

push 立即数,esp地址-4

push dword ptr ds:[0x0019FF6C] 压入0x0019FF6C地址连续4字节的数据,esp地址-4

push word ptr ds:[0x0019FF6C] 压入0x0019FF6C地址连续2字节的数据,esp地址-2

pop

pop 16位寄存器,esp地址+2

pop 32位寄存器,esp地址+4

pop dword ptr ds:[0x0019FFDC] 将0019FFDC连着的4字节的数据改为被弹出的数据,esp地址+4

pop word ptr ds:[0x0019FFDC] 将0019FFDC连着的2字节的数据改为被弹出的数据的后2字节,esp地址+2

pushad

将8个通用寄存器存入堆栈中,方便修改工作

popad

将8个通用寄存器从堆栈中弹出,还原寄存器现场

【reverse】逆向4 初识堆栈的更多相关文章

  1. Evaluate Reverse Polish Notation(堆栈)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  2. 网络对抗技术 2017-2018-2 20152515 Exp1 PC平台逆向破解 笔记

    Exp1 PC平台逆向破解 1.堆栈不可保护: ROP 2.alsr 随机化: 填充NOPS "\90" 3.不加堆栈保护 shellcode: 1.不依赖外部函数 2.不含\00 ...

  3. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  4. historyReverser & array reverse

    historyReverser & array reverse\ "use strict"; /** * * @author xgqfrms * @license MIT ...

  5. JavaScript数组对象详情

    Array 数组概述 Array 类型是 ECMAScript 最常用的类型.javaScript 中的 Array 类型和其他语言中的数组有着很大的区别. 虽然数组都是有序排列,但 javaScri ...

  6. CTF:从0到1 -> zero2one

    本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...

  7. html+css笔记

    文档结构 1.html文档结构 ①文档类型声明 严格型(标准模式):    <!DOCTYpE HTML>   HTML5 XHTML 1.0:<!DOCTYpE html pUbL ...

  8. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  9. css动画 animation

    今天用css做了一个简单的三角上下移动的一个小动画,说白了就是在改变该物体的height值.除了这个方法,还可以用js. 一.在用css写动画时,一定要记住兼容性问题.如何解决该兼容性?在前面加内核前 ...

随机推荐

  1. 嵌入式实验一:LED灯点亮

    实验一:LED灯程序 一. 实验环境 开发机环境 ​ 操作系统:ubuntu 12.04 ​ 交叉编译环境:arm-linux-gcc 4.3.2 ​ 6410板子内核源码:linux-3.0.1 目 ...

  2. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  3. IDEA控制台中文显示乱码处理

    加入 -Dfile.encoding=UTF-8 以及

  4. Guava Retryer实现接口重试

    前言 小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理: 这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续处理: 这个问题该如何解决呢 ...

  5. nim_duilib(8)之combo

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 combo的更多用法,请参考源码中combo.h提供的函数,文末添加其提供的公有函数 xml文件添加代码 基于 ...

  6. Beautiful Walls

    [1553] Beautiful Walls 时间限制: 1000 ms 内存限制: 65535 K 问题描述 To simplify the building process, XadillaX b ...

  7. Codeforces 339B:Xenia and Ringroad(水题)

    time limit per test : 2 seconds memory limit per test : 256 megabytes input : standard input output ...

  8. P4081 [USACO17DEC]Standing Out from the Herd P

    知识点: 广义 SAM 原题面 Luogu 「扯」 随便「口胡」一下居然「过」了. 比较考验「代码能力」,第一次感觉「大模拟」没有白写((( 还有这个「符号」实在是太「上头」了. 前置知识 在线构造广 ...

  9. 源码解析C#中PriorityQueue(优先级队列)的实现

    前言 前段时间看到有大佬对.net 6.0新出的PriorityQueue(优先级队列)数据结构做了解析,但是没有源码分析,所以本着探究源码的心态,看了看并分享出来.它不像普通队列先进先出(FIFO) ...

  10. DFT, DHT, DCT, DST

    目录 基本 酉变换 others Fourier-related Transforms DFT DHT DCT 与DFT的联系 DST 与DFT的联系 Gonzalez R. C. and Woods ...