CTF逆向-[b01lers2020]chugga_chugga-go语言逆向反编译后发现条件判断,使用z3约束求解

CTF逆向-[b01lers2020]chugga_chugga-go语言逆向反编译后发现条件判断,使用z3约束求解

来源:https://buuoj.cn/

内容

附件:链接:https://pan.baidu.com/s/1IcjTPjpUQf_oLFiJil8X7Q?pwd=lnl8 提取码:lnl8

答案:pctf{s4d_chugg4_n01zez}

总体思路

发现是go

耐心地将约束一个一个加入到脚本中

运行得到flag

详细步骤

  • 查看文件内容

    • CTF逆向-[b01lers2020]chugga_chugga-go语言逆向反编译后发现条件判断,使用z3约束求解_第1张图片
  • 使用ida7.7版本打开,发现是go编写的程序。注意,ida在7.6版本以后才开始支持go的反编译,建议安装最新版ida。这之前只能是通过idago的插件实现。

    • 新版本下载 CTF逆向-常用的逆向工具 提取码:pnbt
  • 进入后找到main_main函数的位置

    • CTF逆向-[b01lers2020]chugga_chugga-go语言逆向反编译后发现条件判断,使用z3约束求解_第2张图片
  • 发现是一堆对输入值的判断,使用z3的python库对其进行约束求解即可

    • CTF逆向-[b01lers2020]chugga_chugga-go语言逆向反编译后发现条件判断,使用z3约束求解_第3张图片
  • 为了方便看数组和变量的关系,可以按n键将其命名成和数组一样的名字以避免混淆。要注意v_multi是v_17 + v_11 - v_5 - v_18,v_18_minus_17是v_18 - v_17,在后续添加约束求解的时候要记得加括号,或者是直接将其变量整体添加一个约束,然后一起加入到条件中去。

    • if ( v_8 + 4 == v_1
            && (v_17 = v2[17], v_11 = v2[11], 125 - v_17 + 40 == v_11)
            && (v_18 = v2[18], v_multi = v_17 + v_11 - v_5 - v_18, v_18_minus_17 = v_18 - v_17, v_multi == v_18_minus_17)
            && (v_6_minus_17 = v_6 - v_17, *v2 == v_18_minus_17 * (v_6_minus_17 >> 1) + 110)
            && (v_10 = v2[10], v_13 + 1 == v_10)
            && v_6_minus_17 + 2 * v_6_minus_17 + 4 * (v_4 - v_7) == v_10
            && v2[20] - v_1 == 2 * v_18_minus_17
            && (v_5 ^ 110) == 29
            && v_6_minus_17 == 4 * v_18_minus_17
            && v2[6] == v_14 )
          {
            main_win();
            v3 = v20;
          }
      
  • 最后得到解密的z3脚本

    • import z3
      s = z3.Solver()
      v2 = [z3.Int(x) for x in range(23)]
      v2[2] = ord('t')
      v2[9] = ord('c')
      v2[16] = ord('n')
      v2[21] = ord('z')
      v2[22] = ord('}')
      v2[5] = ord('s')
      v2[3] = 18 ^ ord('t')
      v2[1] = ord('c')
      v2[7] = ord('d')
      v2[19] = ord('z')
      s.add(v2[13] == v2[12])
      s.add(v2[14] + v2[6] == 104)
      s.add(v2[4] == 123)
      s.add(v2[8] == v2[15])
      
      s.add(v2[8] + 4 == v2[1])
      s.add(125 - v2[17] + 40 == v2[11])
      s.add(v2[17] + v2[11] - v2[5] - v2[18] == (v2[18] - v2[17]))
      s.add(v2[0] == (v2[18] - v2[17]) * ((v2[6] - v2[17]) / 2) + 110)
      s.add(v2[13] + 1 == v2[10])
      s.add(v2[6] - v2[17] + 2 * (v2[6] - v2[17]) + 4 * (v2[4] - v2[7]) == v2[10])
      s.add(v2[20] - v2[1] == 2 * (v2[18] - v2[17]))
      s.add((v2[5] ^ 110) == 29)
      s.add(v2[6] - v2[17] == 4 * (v2[18] - v2[17]))
      s.add(v2[6] == v2[14])
      
      
      r = s.check()
      print(r)
      if repr(r) == 'sat':
          result = s.model()
          for k in result:
              index = int(str(k).replace('k!', ''))
              v2[index] = result[k].as_long()
          print(v2)
          print(''.join([chr(x) for x in v2])) # pctf{s4d_chugg4_n01zez}
      
  • 运行得到flag pctf{s4d_chugg4_n01zez}

其他文档

  • CTF逆向-常用的逆向工具 提取码:pnbt
  • B站教程中国某省队CTF集训(逆向工程部分)
    • 中国某省队CTF集训(逆向工程部分)(已授权)(一)
    • 基础加密方式例如 XXTEABase64换表
    • Python库 Z3 方程式、不定式等的 约束求解
    • 基础的假跳转花指令(脏字节)
    • 非自然程序流程
      • 扁平化程序控制流
      • OLLVM程序流程(虚拟机壳) 很难一般不考
      • ida里面按X键跟踪,寻找所有Tyw的引用(即类型是写入的),通常就是关键位置
    • 中国某省队CTF集训(逆向工程部分)(已授权)(二)
    • ollydb动调去壳,upx为例子
    • python的逆向和自定义虚拟指令
      • 使用pycdc 提取码:dorr 解密python编译的exe或者pyc
      • 逐条去解析用py字典手动实现的指令调用
      • C++编译的程序的逆向
    • 中国某省队CTF集训(逆向工程部分)(已授权)(三)
      • 简单模运算加密
      • base58 寻找一下特别大的数,这种数通常是算法的标识,或者ida7.7版本以上自带的find crypt插件ctrl+alt+f
      • 常见的关键位置是有新的内存分配的地方通常是关键地方,或者函数中间突然return的地方也是
      • 迷宫题 注意绘制出来就好
      • 动调题
        • 注意观察会执行的反调试分支,例如出现int 3,需要跳过去
  • 基本知识
    • 大小端序

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

相关逆向CTF题

  • Python

    • Python反汇编方法 Python的pyc字节码反编译反汇编相关知识
    • [CTF逆向-羊城杯 2020]Bytecode-WP-Python字节码反编译
  • 远程调试汇编

    • CTF逆向-[watevrCTF 2019]Timeout-WP-远程调试和修改程序当前运行位置RIP
  • 流程控制

    • CTF逆向-Dig the way Interesting Pointer-通过栈溢出方式覆盖变量以达到修改执行流程的目的
  • 逆向思维

    • [CTF逆向-NPUCTF2020]Baby Obfuscation-逆向思维编写脚本以及函数含义的逻辑理解
    • [CTF逆向-MRCTF2020]EasyCpp - C++类型的逆向通用操作方法
    • [CTF逆向-SUCTF2018]babyre-WP-cpp简单迭代并按表输出值的爆破
  • 安卓

    • [CTF逆向-网鼎杯 2020 青龙组]bang-安卓脱壳逆向:frida-dexdump导出得到源码
  • 虚拟机

    • [CTF逆向-GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用
    • [CTF逆向-WMCTF2020]easy_re-WP_虚机-perl加载器截取
  • 反调试和SMC

    • [CTF逆向-SCTF2019]creakme-WP-基于AES加密算法下的保护:反调试及except_handler和SMC
    • CTF逆向-[FlareOn1]Shellolololol-栈上执行,多层smc的动调得到最终结果
  • 加密

    • Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例
    • [CTF逆向-FlareOn2]very_success-WP_rol循环位移加密
    • base64换表
      • [CTF逆向-CISCN2018]2ex-WP_mips-32架构以及base64换表
      • [CTF逆向-De1CTF2019]Re_Sign-简单脱壳和base64换表编码的深度算法跟踪
  • 花指令

    • [CTF逆向-SCTF2019]babyre-WP_简单去花指令和流程识别
  • 流程混淆的扁平化处理

    • [CTF逆向-RoarCTF2019]polyre-WP_控制流扁平化去混淆idcpy去指令

    • CTF逆向-[SUCTF2019]hardcpp-使用优化过的deflat.py处理混淆的控制流并将cpp的lambda解析得到实际处理逻辑

你可能感兴趣的:(CTF-逆向,安全,python)