【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个通用寄存器从堆栈中弹出,还原寄存器现场

最新文章

  1. 99乘法表(bash)
  2. 到底是 const 还是 static readonly
  3. C语言代码优化(转)
  4. ECMAScript继承
  5. Spring 实践 -AOP
  6. 设置图层符号风格为用已有mxd里的同名图层风格
  7. DataGrid( 数据表格) 组件[7]
  8. 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
  9. Jobject 使用
  10. C语言常见错误笔记
  11. File Transfer
  12. 2019-2-21.NET中异常类(Exception)
  13. python数学第二天【泰勒展开式】
  14. docker-mysql-cron-backup不能执行任务
  15. Kafka认证权限配置(动态添加用户)
  16. How to write threats to validity?
  17. python报错函数传参数传多了
  18. sql语句语法
  19. XXS level2
  20. Codeforces Round #215 (Div. 2) D. Sereja ans Anagrams

热门文章

  1. PLSQL Developer 13安装教程
  2. Linux中find命令与三剑客之grep和正则
  3. CF177A1/A2 Good Matrix Elements 题解
  4. 实时&离线皮肤渲染技术(Real-time&Offline Skin Rendering)
  5. mysql如何查询某个库,某个表都有哪些字段
  6. JAVA将文件转换成byte数组(byte[])
  7. SpringBoot使用@Async实现异步调用
  8. JAVAWEB进行PC支付宝支付、查询订单支付状态
  9. C语言获取字符年月日时分秒毫秒
  10. html5调用摄像头并拍照