关于32位和64位程序的传参方法及虚拟机调试工具总结

一、传参方法对比

1. 32位程序
  • 系统调用 (Linux)

                使用int 0x80指令触发系统调用

                寄存器传参顺序:

eax = 系统调用号
ebx = 第1个参数
ecx = 第2个参数
edx = 第3个参数
esi = 第4个参数
edi = 第5个参数
  • 普通函数调用 (C语言)

                栈传递参数:参数从右向左压栈

                调用者负责清理栈空间(如cdecl约定)

                示例汇编:

push arg3  ; 最后1个参数先压栈
push arg2
push arg1
call function
add esp, 12 ; 清理栈
2. 64位程序
  • 系统调用 (Linux)

    • 使用syscall指令触发系统调用

    • 寄存器传参顺序:

      rax = 系统调用号
      rdi = 第1个参数
      rsi = 第2个参数
      rdx = 第3个参数
      r10 = 第4个参数
      r8  = 第5个参数
      r9  = 第6个参数
  • 普通函数调用 (System V AMD64 ABI)

    • 寄存器+栈传递:前6个参数通过寄存器传递,后续参数压栈

    • 寄存器顺序:

      rdi = 第1个参数
      rsi = 第2个参数
      rdx = 第3个参数
      rcx = 第4个参数
      r8  = 第5个参数
      r9  = 第6个参数
    • 调用时需对齐栈到16字节边界

  • Windows x64调用约定

    • 前4个参数:rcx, rdx, r8, r9

    • 需预留32字节"影子空间"(Shadow Space)

二、虚拟机调试工具命令

1. GDB 常用命令
命令作用
info registers查看所有寄存器值
print $rax查看特定寄存器值
disas反汇编当前函数
x/10x $rsp查看栈顶10个十六进制值
x/s 0x404000查看地址0x404000处的字符串
break *0x401000在地址0x401000设置断点
stepi (si)单步执行一条指令
2. 高级调试技巧
  • 查看内存布局

    cat /proc/[pid]/maps          # Linux查看进程内存映射
    vmmap [pid]                   # macOS查看内存布局
  • 动态跟踪参数传递

    strace -e trace=execve ./program  # 跟踪系统调用
    ltrace ./program                 # 跟踪库函数调用

三、虚拟机调试环境配置

1. 跨架构调试(如ARM程序)
# 使用qemu模拟其他架构
qemu-arm -g 1234 ./program_arm  # 启动ARM程序并监听调试端口# GDB连接
gdb-multiarch
(gdb) target remote :1234
2. 典型问题排查流程
  1. 使用checksec检查程序保护机制

  2. 在关键函数/系统调用处设置断点

  3. 单步跟踪观察寄存器变化

  4. 结合反汇编分析参数传递路径

  5. 修改寄存器值测试漏洞利用(如set $rip=0x401000

四、示例对比

32位 vs 64位 write系统调用
; 32位: 输出 "Hello" (4字节写)
mov eax, 4       ; sys_write
mov ebx, 1       ; fd=1(stdout)
mov ecx, msg     ; 字符串地址
mov edx, 5       ; 长度
int 0x80; 64位: 相同功能
mov rax, 1       ; sys_write
mov rdi, 1       ; fd
mov rsi, msg
mov rdx, 5
syscall

时光匆匆,一篇博客又到了结尾处啦。真心感谢每一位愿意花时间阅读我文字的朋友,希望你们每天都过得开开心心的,生活顺顺利利哦,咱们下次再通过文字‘相遇’呀。

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

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

相关文章

vivado 7 系列器件时钟

7 系列器件时钟 注释: 本章节以 Virtex -7 时钟源为例。 Virtex-6 的时钟资源与此类似。如果使用不同的架构,请参阅有关器件的 《时 钟资源指南》 [ 参照 40] 。 Virtex-6 和 Virtex-7 器件内含 32 个称为 BUFG 的全局时钟缓存。 BUFG 可满…

无须付费,安装即是完全版!

不知道大家有没有遇到过不小心删掉了电脑上超重要的文件,然后急得像热锅上的蚂蚁? 别担心,今天给大家带来一款超给力的数据恢复软件,简直就是拯救文件的“救星”! 数据恢复 专业的恢复数据软件 这款软件的界面设计得特…

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成…

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台,提供 Gymnasium(OpenAI Gym) 接口,主要用于强化学习(Reinforcement Learning, RL)、多智能体竞速(Multi-Ag…

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…

智体链:大语言模型协作完成长上下文任务

25年1月来自Penn State U和谷歌云的论文“Chain of Agents: Large Language Models Collaborating on Long-Context Tasks”。 解决有效处理长上下文的挑战已成为大语言模型 (LLM) 的关键问题。出现了两种常见策略:1)减少输入长度,例如通过检…

java s7接收Byte字节,接收word转16位二进制

1图: 2.图: try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…

机器学习在癌症分子亚型分类中的应用

学习笔记:机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题:Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊:Cancer Cell发表时间:20…

Redis --- 使用HyperLogLog实现UV(访客量)

UV 和 PV 是网站或应用数据分析中的常用指标,用于衡量用户活跃度和页面访问量。 UV (Unique Visitor 独立访客): 指的是在一定时间内访问过网站或应用的独立用户数量。通常根据用户的 IP 地址、Cookies 或用户 ID 等来唯一标识一个用户。示例&#xff1…

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分,它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展,下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…

Vue 3 中的 el-tooltip 详解:语法、示例及与其他框架对比

目录 前言1. 基本知识2. 实战Demo 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 基本知识 el-tooltip 是 Element Plus(Vue 3 组件库)中的一个用于提示的组件,它可以在…

Day 31 卡玛笔记

这是基于代码随想录的每日打卡 491. 非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等&#xff0…

docker /var/lib/docker/overlay2目录把磁盘空间占满问题

1、查看服务器磁盘空间 df -h果然100%了,docker系统文件把磁盘空间占满了。 2、进入overlay2目录,查找那个容器工作目录占用最高 cd /var/lib/docker/overlay2du -h --max-depth1详见下图 好家伙占用110G!复制目录名称2c3c48ccac533c5d4a366d45a19bb9…

02vue3实战-----项目目录详解

02vue3实战-----项目目录详解 1.目录完整结构2.extensions.json文件3.node_modules文件夹4.public文件夹5.src文件夹6.文件.gitignore7.文件env.d.ts8.文件index.html9.文件package-lock.json和文件package.json10.文件README.md11.文件vite.config.ts12.文件tsconfig.json和文…

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 将4个按键的引脚设置为input,并将初始状态设置为Pull-up(上拉输入) 为解决按键抖动的问题,我们…

qt部分核心机制

作业 1> 手动将登录项目实现,不要使用拖拽编程 并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一个跳转信号,如果登录失败&#…

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理,就需要先了解一下Spring Boot自动配置的过程,首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时,EnableAutoConfiguration注解被激活,该注解…

【论文阅读】Comment on the Security of “VOSA“

Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…

idea隐藏无关文件

idea隐藏无关文件 如果你想隐藏某些特定类型的文件(例如 .log 文件或 .tmp 文件),可以通过以下步骤设置: 打开设置 在菜单栏中选择 File > Settings(Windows/Linux)或 IntelliJ IDEA > Preference…

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…