CTF逆向-[MRCTF2020]EasyCpp - C++类型的逆向通用操作方法

CTF逆向-[MRCTF2020]EasyCpp - C++类型的逆向通用操作方法

来源:https://buuoj.cn/

内容

附件:链接:https://pan.baidu.com/s/1wbB31ubefyD0B4cMSZxLyQ?pwd=2qmr 提取码:2qmr

答案:flag{4367FB5F42C6E46B2AF79BF409FB84D3}

总体思路

打开发现是cpp的逆向

正常f5查看伪代码以后逐个向下分析其逻辑

发现主要加密和变换逻辑以后编写逆向逻辑的脚本

注意审题是md5+大写

此题有视频 ,见视频后半段 中国某省队CTF集训(逆向工程部分)(已授权)(二)

详细步骤

  • 查看文件信息

    • image-20220426094252529
  • 使用ida打开以后发现是cpp的

    • image-20220426101622263
  • 读取了9次输入

    • image-20220426101754124
  • 调用lambda函数,执行数据加密,点进去发现是异或数据

    • image-20220426101906646
    • 碰到这种有operator表示是执行函数,双击进去看具体内容即可
    • image-20220426101942549
    • 发现是异或1
    • image-20220426102019236
  • 在循环中对每个字符串再次调用lambda,进行字符替换

    • image-20220426102126356

    • 同样双击进去以后按R键将数值替换为字符,查看其替换内容

      • image-20220426102239145

      • v_replace = [
            ['O', '0'],
            ['l', '1'],
            ['z', '2'],
            ['E', '3'],
            ['A', '4'],
            ['s', '5'],
            ['G', '6'],
            ['T', '7'],
            ['B', '8'],
            ['q', '9'],
            ['=', ' '],
        ]
        
  • 同样方法继续向下看,看到下一个lambda,点进去发现是将输入ans进行对比,在ans处按x查看引用以找到其初始化的位置,得到初始化值

    • image-20220426102426066

    • image-20220426103748905

    • image-20220426102618935

    • ans = [
          '=zqE=z=z=z',
          '=lzzE',
          '=ll=T=s=s=E',
          '=zATT',
          '=s=s=s=E=E=E',
          '=EOll=E',
          '=lE=T=E=E=E',
          '=EsE=s=z',
          '=AT=lE=ll'
      ]
      
  • 整理上述过程,得到计算原文的exp,同时根据题目说明,是将结果md5后取大写

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yb8wqO11-1650940551131)(https://raw.githubusercontent.com/serfend/res.image.reference/main/image-20220426102740566.png)]
  • 最终的exp

    • v_replace = [
          ['O', '0'],
          ['l', '1'],
          ['z', '2'],
          ['E', '3'],
          ['A', '4'],
          ['s', '5'],
          ['G', '6'],
          ['T', '7'],
          ['B', '8'],
          ['q', '9'],
          ['=', ' '],
      ]
      
      ans = [
          '=zqE=z=z=z',
          '=lzzE',
          '=ll=T=s=s=E',
          '=zATT',
          '=s=s=s=E=E=E',
          '=EOll=E',
          '=lE=T=E=E=E',
          '=EsE=s=z',
          '=AT=lE=ll'
      ]
      
      
      def f_replace(raw: str) -> str:
          for x in v_replace:
              raw = raw.replace(x[0], x[1])
          return raw
      
      
      def f_depart(raw: str) -> int:
          r = raw.strip()
          r = r.split(' ')
          r = [int(x) for x in r]
          result = 1
          for i in r:
              result *= i
          return result
      
      ans = [f_replace(x) for x in ans] # 第三个处理,替换
      ans = [f_depart(x) for x in ans] # 第二个处理, 分解数值
      ans = [x ^ 1 for x in ans] # 第一个处理, 异或1
      ans = [str(x) for x in ans] # 转换为字符串
      ans = ''.join(ans) # 合并最后结果
      print(ans)
      import hashlib
      flag = hashlib.md5() # 按题目要求转换为md5
      flag.update(ans.encode())
      flag = flag.hexdigest().upper()
      print(flag)
      
    • 得到题目答案234512225774247633749032245635316720,flag4367FB5F42C6E46B2AF79BF409FB84D3

其他文档

更多CTF逆向题通用性做法和常用工具下载参考该博文内容:CTF逆向Reverse题的玩法

相关逆向CTF题

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值