汇编实现缓冲区溢出1

input:

pushl         %ebp # 保存帧指针

mov           %esp, %ebp # 更新栈指针位置

pushl         %ebx # 压入保护寄存器

subl           $20, %esp # 通过减法运算在栈上分配 20 个字节的空间

leal           -12(%ebp), %ebx # 计算缓冲区开始的位置,是 %ebp - 12,存放到 %ebx 中

movl         %ebx, (%esp) # 将缓冲区开始的位置存到栈中(这是调用 gets 的参数)

call            gets # 调用 gets

movl         %ebx, (%esp) # 这是调用 puts 的参数

call            puts; # 调用 puts

addl          $20, %esp # 释放 20 个字节的空间

popl         %ebx; # 恢复保护寄存器

popl         %ebp; # 弹出帧指针

ret;           # 返回

解析

  1. 缓冲区分配subl $20, %esp 这一行代码从栈上分配了20个字节的空间。这意味着程序为用户输入分配了固定大小的缓冲区。

  2. 缓冲区位置计算leal -12(%ebp), %ebx 这一行计算了缓冲区的起始地址,并将这个地址存储在%ebx寄存器中。这里通过%ebp - 12来定位缓冲区的起始位置,这通常意味着缓冲区是从栈帧的底部向上计算的。

  3. gets函数调用call gets 这一行调用了gets函数,它从标准输入读取数据直到遇到换行符或文件结束标志(EOF)。问题在于gets函数不会检查输入的字符数是否超出了缓冲区的大小,这允许用户输入超过20字节的数据。

  4. 缓冲区数据使用movl %ebx, (%esp)call puts 这两行代码将缓冲区的地址传递给puts函数,该函数将输出缓冲区的内容。如果gets读取的输入超出了缓冲区的大小,那么超出的数据也会被puts函数输出,这可能导致程序的其他部分被覆盖。

 

详细解析 

pushl %ebp                                 - 将基指针(ebp)压入栈中,以保存当前函数的基指针。

mov %esp, %ebp                         - 将栈指针(esp)的值移动到基指针(ebp),更新当前函数的栈帧基址。

pushl %ebx                                 - 将基址寄存器(ebx)压入栈中,以保护它,因为在接下来的操作中可能会覆盖它的值。

subl $20, %esp                           - 从栈指针中减去20,为局部变量分配20个字节的空间。

leal -12(%ebp), %ebx                 - 计算缓冲区的起始地址,即ebp减去12,并将这个地址存储在ebx寄存器中。

movl %ebx, (%esp)                    - 将ebx中的地址值移动到栈顶,作为gets函数的参数。

call gets                                      - 调用gets函数,从标准输入读取一行数据,直到遇到换行符或EOF,并将其存储在上一步指定的地址。

movl %ebx, (%esp)                   - 再次将ebx中的地址值移动到栈顶,这次是作为puts函数的参数。

call puts                         - 调用puts函数,将存储在ebx指向的缓冲区中的字符串输出到标准输出。

addl $20, %esp                  - 将栈指针增加20,释放之前分配的20个字节空间。

popl %ebx                 - 从栈中弹出之前保存的ebx寄存器的值,恢复ebx寄存器。

popl %ebp                 - 从栈中弹出之前保存的ebp寄存器的值,恢复ebp寄存器。

ret                                 - 从当前函数返回到调用它的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之SQL注入漏洞复现(中篇)(技术进阶)

目录 一,报错注入 二,布尔盲注 三,sleep延时盲注 四,DNSlogs 盲注 五,二次注入 六,堆叠注入 总结 一,报错注入 报错注入就是在错误信息中执行 sql 语句,利用网站的报错信息来带…

探索Linux系统:详尽指南教你查看系统信息

在Linux环境下工作时,了解系统的关键信息有助于我们更好地管理、诊断和优化系统性能。本文将详细介绍一系列实用命令,助你全面掌握Linux系统的硬件配置、软件版本、资源使用状况等重要细节。无论是日常运维还是故障排查,这些命令都是不可或缺的工具。让我们开始探索之旅吧!…

【奶奶看了都会】用 AI做猫咪剧情短片保姆级教程

大家这段时间在刷短视频的时候,是不是经常会刷到那种猫咪剧情短片,配合喵喵喵......的魔性背景音乐,让人看了非常上头。最近这类视频在抖音、视频号、小红书上非常火,今天就来教大家如何制作。 1.GPT4账号准备 我们用到的AI生图…

应用于智能装备制造,钡铼IOy系列模块展现其强大的灵活性和实用性

随着科技的飞速发展,智能制造已经成为工业4.0时代的核心驱动力。在此背景下,钡铼技术推出的IOy系列模块以其独特的设计、卓越的性能以及无可比拟的灵活性与实用性,在智能装备制造领域展现出了强大的技术优势和应用价值。 首先,钡…

HTTP与SOCKS-哪种协议更适合您的代理需求?

网络代理技术是我们日常使用网络时必不可少的一项技术,它可以为我们提供隐私保护和负载均衡的能力,从而保证我们的网络通信更加安全和顺畅。而其中最主流的两种协议就是HTTP和SOCKS。虽然它们都是用于网络代理的协议,但在实际应用中却存在着一…

python:根据旋转平移矩阵求取原始点云或者转换后点云

根据旋转平移矩阵求取原始点云或者转换后点云 原始点云进行旋转平移示例 1示例 2示例 3示例 4 根据转换后点云及转换矩阵求原始点云示例 1示例 2示例 3示例 4 原始点云进行旋转平移 转换前的点云可以表示为一个N行3列的矩阵,每一行代表一个点的坐标。我们定义一个旋…

Gitea:轻量级全功能DevSecOps平台的深度解析

Gitea:轻量级全功能DevSecOps平台的深度解析 在软件开发和版本控制领域,Gitea以其轻量级、开源和自托管的特点,逐渐受到越来越多个人开发者和小型团队的青睐。作为一个基于Go语言编写的Git服务软件,Gitea旨在提供一个易于安装、快…

儿童护眼落地灯哪个牌子好?值得买的五款大路灯分享

近年来,随着近视问题日益严重,消费者越来越倾向于选购能够优化照明环境、减轻眼部压力的护眼落地灯。然而,市场上的护眼落地灯品质良莠不齐,许多品牌为了追求低廉价格和扩大市场份额,不惜采取模仿甚至抄袭的方式&#…

NL2SQL技术方案系列(6):金融领域知识检索,NL2SQL技术方案以及行业案例实战讲解4

NL2SQL技术方案系列(6):金融领域NL2SQL技术方案以及行业案例实战讲解4 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七…

MySQL主从结构搭建

说明:本文介绍如何搭建MySQL主从结构; 原理 主从复制原理如下: (1)master数据写入,更新binlog; (2)master创建一个dump线程向slave推送binlog; &#xff…

TIMEDAY·腾讯智慧出行技术开放日:发布汽车行业大模型、升级智能汽车云

4月24日,北京车展前夕,在“2024 TIME DAY腾讯智慧出行技术开放日”上,腾讯发布了汽车行业大模型“全域智能”方案,覆盖汽车研发、生产、营销、服务、企业协同等五大核心场景。与此同时,腾讯发布了在智能汽车云、智能座…

C++中的程序流程结构

一、选择结构 1.1 if语句 作用&#xff1a;执行满足条件的语句 if语句的三种形式 单行格式if语句多行格式if语句多条件的if语句 #include <iostream> using namespace std;int main(){//选择结构 单行if语句//用户输入分数&#xff0c;如果分数>600,视为考上一本大…

开发一款游戏,需要注意哪些问题?

开发一款游戏需要注意以下几个关键问题&#xff1a; 目标受众和市场调研&#xff1a; 在开始制作游戏之前&#xff0c;了解你的目标受众是谁以及他们的需求是什么至关重要。进行市场调研&#xff0c;探索当前市场上的竞争情况和玩家喜好&#xff0c;以便制定出色的游戏概念。 …

KaFak知识总结(1)

Kafka课程(端口号9092) 一、kafka将数据保存在哪里&#xff1f; kafka是将数据保存在磁盘。 二、离线计算、实时计算 离线计算&#xff1a;T1模式。处理的数据是静态数据&#xff0c;有界限&#xff0c;知道什么时候开始也知道什么时候结束。 实时计算&#xff1a;以事件为…

BTSB-面试题

面试笔试题 在32位系统里面&#xff0c;用C语言写一个程序&#xff0c;如何判断小端和大端 #include <stdio.h>// 判断系统字节序的函数 void checkEndianness() {unsigned int num 1;char *ptr (char*)&num;// 如果第一个字节存储的是最低有效字节&#xff0c;则…

【SpringBoot实战篇】获取用户详细信息-ThreadLocal优化

1 分析问题 对token的解析当初在拦截器中已经写过。期待的是在拦截器里写了&#xff0c;在其他地方就不写了&#xff0c;应该去复用拦截器里面得到的结果 2 解决方式-ThreadLocal 2.1提供线程局部变量 用来存取数据: set()/get()使用ThreadLocal存储的数据, 线程安全 2.2过程图…

OneFlow新概念清单,AI深度学习的革命性突破(AI写作)

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

路由过滤与引入

1、实验拓扑 2、实验要求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 1oopback口模拟业务网段 2、运行 oSPF&#xff0c;各自协议内部互通 3、R1 和 R2 运行 RIPv2,R2&#xff0c;R3和R4在 RIP 和 oSPF 间配置双向路由引入,要求除 R4 上的业务…

mPEG-Cyanur,Methoxy PEG Cyanur具有良好的生物相容性

【试剂详情】 英文名称 mPEG-Cyan&#xff0c;mPEG-Cyanur&#xff0c;Methoxy PEG Cyanur&#xff0c;Methoxy PEG Cyan 中文名称 聚乙二醇单甲醚三聚氯氰&#xff0c;甲氧基-聚乙二醇-氰尿酸 外观性状 由分子量决定&#xff0c;固体或者粘稠液体。 分子量 0.4k&#x…

自己写的爬虫小案例

网址&#xff1a;aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …