有关C语言中字符串入栈的理解

2023-05-16

C语言中字符串的入栈

写在前面
对于C语言中变量入栈的顺序实际上需要具体情况具体分析,不同操作系统下的编译器可能对此有不同的解释,即使对于同一个C的编译器而言,参数设定的不同也会导致编译器调整局部变量的入栈顺序,例如一种栈溢出的防护方案下,int类型的变量可能始终是最后入栈的。

本次实践利用的编译器版本是Windows下的64位编译器: x86_64-pc-cygwin-version 11.2.0

我们在test.c中编写如下代码,申请一个局部的字符数组,然后退出。

#include <stdio.h>
int main() {
    char str[5] = "abcdef";
    return 0;
}

在命令行编译输出汇编代码:

gcc -S test.c -o test.asm

得到如下的汇编代码(AT&T)

	.file	"test.c"
	.text
	.def	__main;	.scl	2;	.type	32;	.endef
	.globl	main
	.def	main;	.scl	2;	.type	32;	.endef
	.seh_proc	main
main:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$48, %rsp
	.seh_stackalloc	48
	.seh_endprologue
	call	__main
	movl	$1684234849, -7(%rbp)
	movw	$26213, -3(%rbp)
	movb	$0, -1(%rbp)
	movl	$0, %eax
	addq	$48, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.ident	"GCC: (GNU) 11.2.0"

代码分析:

main之前的内容在说明函数入口与文件信息,暂时不讨论

.seh_*相关的伪指令是Windows提供的一套结构异常化处理的例程,可以暂时不讨论。

不过从指令名字上我们其实也能简单地了解它们在做什么,例如seh_stackalloc 48就是为堆栈段分配了48字节的空间。

详情可以查阅:https://sourceware.org/legacy-ml/binutils/2009-08/msg00193.html

抛开上述影响因素后,我们来看我们关心的部分,call __main指令之后的内容:

movl $1684234849, -5(%rbp)

转16进制后,左边立即数为 6463 6261H,即“abcd”的端序

movw $26213, -3(%rbp)

转16进制后,左边立即数为66 65H,即“ef”的端序

movb $0, -1(%rbp)

将‘\0’压入栈

因此我们的栈空间为

在这里插入图片描述

总结一下:将字符串压栈时,连续储存,开头的字符对应低地址,结尾字符对应高地址。

从这个原理上我们再理解一下熟知的缓冲区溢出攻击,如果攻击者输入的字符串大于申请的缓冲区长度,末尾多出来的字符串在栈内会向高地址延伸,覆盖掉栈中原有的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有关C语言中字符串入栈的理解 的相关文章

  • 51单片机外部中断示例

    void Usart INT0 init TMOD 61 0X21 TH1 61 0XFD TL1 61 0XFD SM0 61 0 SM1 61 1 REN 61 1 TR1 61 1 ES 61 1 串口中断影响外部中断0 这句话会让程
  • Hive深入浅出UDTF

    前面两篇文章我们分析了UDF和UDAF的原理以及实现思路 xff0c 这一节我们介绍另外一种UDF UDTF User Defined Table Generating Functions xff0c 是用来解决输入一行输出多行的需求的 x
  • STM32学习(3)-GPIO相关寄存器,引脚复用和重映射,点亮LED小灯(库函数、寄存器)

    参考STM32中文参考手册 一 GPIO相关配置寄存器 每组 如GPIOA GPIOB GPIO端口的寄存器包括 1 1 端口配置寄存器 由于STM32是32位的寄存器 xff0c 一个寄存器只有32位 xff0c 但是一个I O口需要4个
  • Template parse errors: Can't bind to 'ngStyle' since it isn't a known property of 'div'. ("

    1 背景 开发个公共组件 xff0c 在组件中使用指令一直报错 template 96 lt div class 61 34 content text bgp 34 gt lt div class 61 34 content text 34
  • linux mount 远程服务器共享目录

    NFS是文件系统 在网络存储方面我们应该有所了解 那么针对NFS服务器的安装和设置我们来详细介绍一下 首先让我们看一下NFS服务器的安装步骤 一 NFS服务器的安装 检查linux系统中是否安装了nfs utils和portmap两个软件包
  • 【每日一题】969. 煎饼排序

    969 煎饼排序 题目描述解决方案 xff1a 类选择排序法代码 xff1a Python 题目来源 xff1a Leetcode 原文链接 xff1a https mp weixin qq com s jboDC0R oYAy ssCXp
  • 让Num Lock默认开启

    让Num Lock默认开启 2008年11月18日 星期二 10 46 A M 1 对于2000或者XP操作系统 xff0c 登陆前NUM LOCK默认为关闭 xff0c 此为正常现象 xff0c 若用户需要此功能 xff0c 则需更改注册
  • Windows下使用Sublime Text配置C++编译环境

    1 打开Sublime xff0c 选择Tools gt Build System gt New Build System 2 将以下代码复制粘贴到新文件中去 34 span class hljs attribute path span 3
  • 一步步将ffmpeg封装golang/cgo库

    欢迎访问博客原文 xff1a https lightfish cn 2018 12 24 ffmpeg cgo 前言 继上一篇 ffmpeg音视频C编程入门 使用高性能的C语言进行音视频的处理 xff0c 比较执行效率比较高 xff0c 但
  • 十六.Spark SQL之读取复杂的json数据

    第一步 准备json数据 test json 34 name 34 34 liguohui 34 34 nums 34 1 2 3 4 5 34 name 34 34 zhangsan 34 34 nums 34 6 7 8 9 10 te
  • “当前不会命中断点 还没有为该文档加载任何符号”问题的解决

    今天在实验室的电脑上调试程序出现了 当前不会命中断点 还没有为该文档加载任何符号 断点失效的情况 xff0c 是调用的静态库中断点失效 xff0c 但程序在我自己电脑上是可以正常打断点的 按照网上的方法试过没有成果 xff0c 但是启发了我
  • 【经验分享】设置电脑定时开关机

    文章目录 1 定时开机设置 xff08 BIOS固件设置 xff09 2 定时关机设置 放长假回家 xff0c 不想拷贝资料 xff0c 因此打算用todesk远程连接办公 但是工位电脑一直开着 xff0c 还不能睡眠 xff0c 担心会过
  • AirSim多台无人机第一视角键盘控制进阶版

    AirSim多台无人机第一视角键盘控制进阶版 目录 AirSim多台无人机第一视角键盘控制进阶版本文实现的效果前言一 环境依赖二 图像读取与显示1 使用的API2 实时显示的一种方法 三 键盘控制改进总结 本文实现的效果 前言 本篇文章实现
  • 百度APP iOS端内存优化实践-内存管控方案

    01 背景 随着业务的发展 xff0c 百度APP有很多大内存业务场景如直播 短视频 小程序 百度识图等 xff0c 通过线上页面统计数据得知超过150M页面有40个 xff0c 耗内存最多的页面有400M 单个页面不会有内存或者稳定性问题
  • 百度APP iOS端内存优化-原理篇

    一 Mach虚拟内存 1 1 Mach内存简介 iOS系统架构可分为内核驱动层 xff08 Kernel and Device Drivers Layer xff09 核心操作系统层 xff08 Core OS xff09 核心服务层 xf
  • 【图文并茂】手把手教你重装Win10系统

    当遇见电脑出现问题 xff0c 想要重装系统的小伙伴们 xff0c 小编在这里手把手教你重装Win10系统 xff0c 推荐系统之家装机大师 xff0c 他是一款非常好用的一键重装工具 xff0c 有不少小伙伴都在使用 xff0c 但对于刚
  • 【每日一题】1994.好子集的数目

    1994 好子集的数目 题目描述解决方案 xff1a 状态压缩 43 动态规划代码 xff1a Python 题目来源 xff1a LeetCode 原文链接 xff1a https mp weixin qq com s myI7 ZwJM
  • Win11打开移动热点后电脑无法上网怎么办?

    Win11打开移动热点后电脑无法上网怎么办 xff1f 有用户将自己的电脑开启移动热点来使用的时候 xff0c 发现自己的电脑出现了无法上网的情况 那么为什么开启热点之后 xff0c 就会无法进行上网呢 xff1f 来看看以下的解决方法分享
  • abaqus导出全部节点应力值

    一 查询应力点 1 2 3 二 导出应力点 1 点击报告 xff08 E xff09 场输出 xff08 F xff09 2 选择想要输出的参数 xff0c 应用 xff08 提前设置好文件夹与文件名 xff09

随机推荐

  • Docker容器之Dockerfile构建镜像

    目录 一 Dcokerfile概念 1 dockerfile的原理 二 Docker镜像的创建 1 基于已有镜像创建 2 基于本地模板创建 3 基于dockerfile创建 三 镜像分层的原理 1 Docker镜像分层 xff08 基于AU
  • 树莓派——开机指南

    1 准备 硬件准备 树莓派一块 SD卡 xff08 小卡 xff09 读卡器 树莓派电源或安卓手机电源 xff08 功率10w以上 xff0c 不然会导致电压不足会影响其性能 xff09 一台电脑 xff08 可以没有显示屏和鼠标键盘 xf
  • pytesseract的使用 | python识别验证码

    目录 1 安装tesseract2 安装pytesseract3 修改包中部分代码4 代码网站测试 1 安装tesseract 详见 xff1a https blog csdn net lijiamingccc article detail
  • 从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    最近去面试了几家公司 xff0c 被问到hashCode的作用 xff0c 虽然回答出来了 xff0c 但是自己还是对hashCode和equals的作用一知半解的 xff0c 所以决定把它们研究一下 以前写程序一直没有注意hashCode
  • powershell 远程执行命令失败

    Connecting to remote server failed with the following error message The WinRM client cannot process the request If the a
  • Hypermesh+Abaqus加载问题

    Hypermesh 43 Abaqus加载问题 参考视频载荷加载问题总结 参考视频 Hypermesh Abaqus联合仿真案例指导1 垂直载荷作用下的平板受力分析 https www bilibili com video av748087
  • C++11智能指针(五):shared_ptr的循环引用的问题及weak_ptr

    shared ptr的主要优点是当不再使用时会自动释放相关的内存 但是如果我们不仔细使用shared ptr xff0c 那么这个优势就会变成一个劣势 我们来看看 xff1a 假设我设计一个二叉树 xff0c 并在其中包含一个指向左右子节点
  • ubuntu编译安装mysql

    使用的gcc版本7 5 0 1 先安装bison libtool gettext texinfo flex cmake openssl ncurses等软件 这些软件的源码编译过程见我前面的博客 2 下载源码 xff0c 注意下载有boos
  • wsl重启及如何在wsl下执行cmd命令

    wsl重启 本质上修改环境变量source不生效 想重启一下又要打开命令行 其实wsl可以直接调用windows下的程序 因此只需要执行 wsl exe 但是执行习惯了reboot 可以在shell的配置文件中配置alias span cl
  • 编译nginx时几种常见错误

    在对nginx进行编译时报了如下图所示错误 src os unix ngx user c In function ngx libc crypt src os unix ngx user c 36 7 error struct crypt d
  • C++利用libtelnet库完成客户端类封装telnet收发

    CMeshSocket h头文件 库文件网址https github com seanmiddleditch libtelnet 需要根据返回数据调整接受规则 xff0c 我连接设备服务器为一问一答 xff0c 返回数据为JSON且以 n结
  • 如何安装Anaconda并解决“‘conda‘ 不是内部或外部命令,也不是可运行的程序”的问题

    如何安装Anaconda 我们在安装完Anaconda后可能会遇到 conda 不是内部或外部命令 xff0c 也不是可运行的程序的问题 xff0c 下面将会放置完整的安装过程和解决这个问题 进入网站 xff0c 下载miniconda h
  • 求某一天是这一年的第几天(判断闰年)

    用结构体实现今天是这一年的第几天 用数组存储每月的天数 include lt stdio h gt typedef struct Day int year int month int day Day bool IsLeapYear int
  • VirtualBox安装Debian之后,Debian无法启动,一直闪烁光标

    https blog csdn net quantum7 article details 104084845
  • 获取本地时间的函数

    span class token keyword function span span class token function getTime span span class token punctuation span span cla
  • Debian-8.7.1 系统安装

    Debian 8 7 1 系统安装 本人使用Linux操作系统多年 xff0c 主要是centos xff0c 但从来没用过debian系统 xff0c 今天准备安装一个系统看看 xff0c 网上查资料 xff0c 大部都是debian老版
  • MySQL 8.0 忘记密码/修改root密码

    1 以管理员身份打开cmd窗口 xff0c 定位到MySQL安装目录下的bin目录 xff0c 输入net stop mysql 回车 xff0c 关闭MySQL数据库 2 输入mysqld console skip grant table
  • python使用ElementTree处理xml容易犯错的点&美化xml

    python使用ElementTree处理xml容易犯错的点 amp 美化xml 引言代码环境相关先上代码 引言 目前因为需要写一个tool处理xml文件 xff0c 对于面向浏览器编程的我来说 xff0c 迅速打开chrome开始搜索关键
  • java截取视频的三种方式

    String cut 61 34 ffmpeg ss 34 43 startTime 43 34 i 34 43 videoPath 43 34 t 34 43 String valueOf seconds 43 34 c v copy c
  • 有关C语言中字符串入栈的理解

    C语言中字符串的入栈 写在前面 对于C语言中变量入栈的顺序实际上需要具体情况具体分析 xff0c 不同操作系统下的编译器可能对此有不同的解释 xff0c 即使对于同一个C的编译器而言 xff0c 参数设定的不同也会导致编译器调整局部变量的入