当前位置: 首页 > article >正文

关于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.kler.cn/a/538457.html

相关文章:

  • Oracle迁移到MySQL
  • Maven入门核心知识点总结
  • Django开发入门 – 0.Django基本介绍
  • 云上考场微信小程序的设计与实现(LW+源码+讲解)
  • 网站改HTTPS方法
  • 如何在Windows中配置MySQL?
  • Linux提供给我们的定时器
  • 【k8s集群应用】kubenetes-YAML
  • QT实现多线程的方法
  • 谷歌浏览器多开指南:如何完成独立IP隔离?
  • 在线免费 HTML 预览导出为图片,并且支持水平切割
  • 基于Flask的汽车质量投诉可视化分析系统的设计与实现
  • 手写一个C++ Android Binder服务及源码分析
  • Java模块化 - 基本介绍
  • 0 CAD开源内核 Truck
  • 【数据结构】(7) 栈和队列
  • 如何在RTACAR中配置IP多播(IP Multicast)
  • 一款由 .NET 官方团队开源的电子商务系统 - eShop
  • python基础语法--笔记1
  • DeepSeek与ChatGPT对比:技术、应用与未来趋势
  • Tekton 可以代替 Jenkins不
  • DNS攻击方式有哪些,应该采取哪些应对措施?
  • c++加载TensorRT调用深度学习模型方法
  • 跟着李沐老师学习深度学习(五)
  • ESP32的IDF实现C语言和C++语言的混合编译
  • P1049 装箱问题(dp)