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
详细步骤
-
查看文件内容
-
使用ida7.7版本打开,发现是go编写的程序。注意,ida在7.6版本以后才开始支持go的反编译,建议安装最新版ida。这之前只能是通过idago的插件实现。
- 新版本下载 CTF逆向-常用的逆向工具 提取码:pnbt
-
进入后找到main_main函数的位置
-
发现是一堆对输入值的判断,使用
z3
的python库对其进行约束求解即可 -
为了方便看数组和变量的关系,可以按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集训(逆向工程部分)(已授权)(一)
- 基础加密方式例如
XXTEA
、Base64
换表 - Python库
Z3
方程式、不定式等的约束求解
- 基础的假跳转花指令(脏字节)
- 非自然程序流程
- 扁平化程序控制流
- OLLVM程序流程(虚拟机壳) 很难一般不考
- ida里面按
X
键跟踪,寻找所有Ty
为w
的引用(即类型是写入的),通常就是关键位置
- 中国某省队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
-
远程调试汇编
-
流程控制
-
逆向思维
-
安卓
-
虚拟机
-
反调试和SMC
-
加密
-
花指令
-
流程混淆的扁平化处理