esp

x86-x64寄存器及CallStack调用栈

心不动则不痛 提交于 2019-12-01 10:16:07
Intel 32位体系结构(简称IA32)处理器包含8个通用寄存器,如下图所示:     EIP是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加。EIP是个特殊寄存器,不能像访问通用寄存器那样访问它,即不可对EIP进行寻址操作。EIP可被jmp、call和ret等指令隐含地改变 函数调用栈的典型内存布局如下图所示: 函数调用过程中的主要指令: 压栈(push): 栈顶指针ESP减小4个字节;以字节为单位将寄存器数据(四字节,不足补零)压入堆栈,从高到低按字节依次将数据存入ESP-1、ESP-2、ESP-3、ESP-4指向的地址单元。 出栈(pop): 栈顶指针ESP指向的栈中数据被取回到寄存器;栈顶指针ESP增加4个字节。 调用(call): 将当前的指令指针EIP(该指针指向紧接在call指令后的下条指令)压入堆栈,以便返回时能恢复执行下条指令;然后设置EIP指向被调函数代码开始处,以跳转到被调函数的入口地址执行。 离开(leave): 恢复主调函数的栈帧以准备返回。 等价于指令序列: movl %ebp, %esp(恢复原ESP值,指向被调函数栈帧开始处) popl %ebp(恢复原ebp的值,即主调函数帧基指针)。 返回(ret): 与call指令配合,用于从函数或过程返回。从栈顶弹出返回地址

逆向学习周记-C语言空函数

做~自己de王妃 提交于 2019-11-30 23:39:41
实验环境:WIN7虚拟机 软件:VC6 首先在VC6里面写一个空函数Fun(); F7编译运行一下,没有出错,接着在函数处使用F9下断点,使程序运行到Fun函数时停下。 接着F5开始运行这个程序 程序停在了Fun函数处,反汇编进去进行逆向分析 可以看到程序停在Fun函数的入口处,这里的call就是Fun函数的入口,F11跟进去进行分析。 原始堆栈图是这样的。 0040D408 call @ILT+5(_Fun) (0040100a) F11,跟进这个call进行分析,进入函数之后编译器会将跳出函数之后下一个要执行的地址压入堆栈,即将0040D40D压入堆栈,同时esp-4,esp变成0012FEF8,这时的堆栈是这样的: 跟进来之后是一个jmp,F11直接跳转。 现在进到函数里面了 00401010 push ebp 首先将ebp压栈,就是将[ebp]压入堆栈,即将0012FF48压入堆栈,然后esp的位置向上提升一个变为0012FEF4。 查看检查寄存器进行验证: 00401011 mov ebp,esp 将esp的值赋给ebp,也就是将0012FEF4赋给ebp,这时的堆栈图是这样的 查看寄存器验证,这里可以看到esp和ebp的值相等,说明上面那个堆栈图没有问题 00401013 sub esp,40h 将esp减去40h,也就是将esp的位置提升到0012FEB4位置

2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

感情迁移 提交于 2019-11-30 16:06:02
操作系统如何工作 一、计算机的三个法宝 1.存储程序计算机 2.函数调用堆栈机制(高级语言可以实现的基础机制) 3.中断 在第一周的作业中对存储程序计算机也就是通俗意义上的冯诺依曼计算机进行了介绍。 第二周的作业中介绍了函数堆栈的结构和寄存器。在这里就不再复述。 二、汇编代码的分析(难点及问题) 本次实验中接触到的是高级语言程序编译成汇编语言的代码,其中就遇到了以下问题。 1.堆栈增长方向的问题 在之前的学习中堆栈都是向下增长的,堆栈上方是高地址下方是低地址,如左图。而在本章中图2-1,堆栈方向为了直观一点变为下方是高地址上方是低地址,如右图。 而对堆栈为什么采用向下增长产生了疑惑。明明不太直观,为什么还是选择向下增长。直到我在网上找了很多资料才找到合理解释的理由。这样设计可以使得堆和栈能够充分利用空闲的地址空间。如果栈向上涨的话,我们就必须得指定栈和堆的一个严格分界线,但这个分界线怎么确定呢?平均分?但是有的程序使用的堆空间比较多,而有的程序使用的栈空间比较多。所以就可能出现这种情况:一个程序因为栈溢出而崩溃的时候,其实它还有大量闲置的堆空间呢,但是我们却无法使用这些闲置的堆空间。所以呢,最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化!原文衔接如下。 http://www.cnblogs.com/Quincy

栈帧ebp,esp详解

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 21:20:12
栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图 出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图 我们来看下面这个C程序在执行过程中,栈的变化情况 void func(int m, int n) { int a, b; a = m; b = n; } main() { ... func(m, n); L: 下一条语句 ... } 在main调用func函数前,栈的情况,也就是说main的栈帧: 从低地址esp到高地址ebp的这块区域,就是当前main函数的栈帧。当main中调用func时,写成汇编大致是: push m push n; 两个参数压入栈 call func; 调用func,将返回地址填入栈,并跳转到func 当跳转到了func,来看看func的汇编大致的样子: __func: push ebp; 这个很重要,因为现在到了一个新的函数,也就是说要有自己的栈帧了,那么

攻防世界--Shuffle

不羁岁月 提交于 2019-11-29 08:34:05
测试文件: https://adworld.xctf.org.cn/media/task/attachments/a03353e605bc436798a7cabfb11be073 1.准备 获得信息 32位文件 2.IDA打开 int __cdecl main(int argc, const char **argv, const char **envp) { time_t v3; // ebx __pid_t v4; // eax unsigned int v5; // ST18_4 unsigned int v6; // ST1C_4 char v7; // ST20_1 signed int i; // [esp+14h] [ebp-44h] char s; // [esp+24h] [ebp-34h] char v11; // [esp+25h] [ebp-33h] char v12; // [esp+26h] [ebp-32h] char v13; // [esp+27h] [ebp-31h] char v14; // [esp+28h] [ebp-30h] char v15; // [esp+29h] [ebp-2Fh] char v16; // [esp+2Ah] [ebp-2Eh] char v17; // [esp+2Bh] [ebp-2Dh] char v18;

攻防世界--game

自作多情 提交于 2019-11-27 16:45:28
题目链接: https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074 1.准备 打开测试用例 首先分析程序 得到是win32程序 2.第一种方法 2.1 分析代码 使用IDA打开,找到main函数,F5得到C代码 得知主要是main_0这个函数,打开 1 "If m of the Nth lamp is 1,it's on ,if not it's off\n" 2 "At first all the lights were closed\n"); 3 sub_45A7BE("Now you can input n to change its state\n"); 4 sub_45A7BE( 5 "But you should pay attention to one thing,if you change the state of the Nth lamp,the state of (N-1)th and (N+1)th w" 6 "ill be changed too\n"); 7 sub_45A7BE("When all lamps are on,flag will appear\n"); 8 sub_45A7BE("Now,input n \n"); 9 while ( 1 )

缓冲区溢出攻击

只愿长相守 提交于 2019-11-27 16:39:08
转自 http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 缓冲区溢出( Buffer Overflow )是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《 0day 安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如 MS 的 Visual Studio2010 。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾 名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成 意外终止。但是如果有人精心构造溢出数据的内容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统 提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组

缓冲区溢出攻击

。_饼干妹妹 提交于 2019-11-27 16:38:02
缓冲区溢出攻击 缓冲区溢出( Buffer Overflow )是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《 0day 安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如 MS 的 Visual Studio2010 。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果有人精心构造溢出数据的内容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区内的,因此所谓缓冲区可以更抽象地理解为一段可读写的内存区域

基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)

。_饼干妹妹 提交于 2019-11-26 03:38:23
实验目的 学习ESP8266模块(ESP-01)的使用。 进一步学习TPYBoardv10x中UART模块的使用。 结合ESP-01模块完成局域网内的TCP通信实验。 所需元器件 ESP-01 WIFI模块 1个 TPYBoard v102板子 1块 USB转TTL 1个 micro USB数据线 1条 杜邦线 若干 本实验采用TPYBoardv102串口AT指令的方式,去连接控制ESP8266模块(型号ESP-01)。 第一步:烧写AT指令的固件 下载AT指令相应固件 这里我下载了一个AiCloud 2.0 AT (512+512map)版本的,版本号:v0.0.0.6。 http://wiki.ai-thinker.com/_media/aicloud/sdk/ai-thinker_esp8266_dout_aicloud_v0.0.0.6_20170517.7z 安信可科技关于ESP8266相关模组的资料地址。 http://wiki.ai-thinker.com/esp8266 AT指令固件其他版本下载。 http://wiki.ai-thinker.com/esp8266/sdk 下载烧写工具ESPFlashDownloadTool http://wiki.ai-thinker.com/_media/esp8266/flash_download_tools_v3.6.4