CTF逆向-[MRCTF2020]EasyCpp - C++类型的逆向通用操作方法
来源:https://buuoj.cn/
内容:
附件:链接:https://pan.baidu.com/s/1wbB31ubefyD0B4cMSZxLyQ?pwd=2qmr 提取码:2qmr
答案:flag{4367FB5F42C6E46B2AF79BF409FB84D3}
总体思路
打开发现是cpp的逆向
正常f5查看伪代码以后逐个向下分析其逻辑
发现主要加密和变换逻辑以后编写逆向逻辑的脚本
注意审题是md5+大写
此题有视频 ,见视频后半段 中国某省队CTF集训(逆向工程部分)(已授权)(二)
详细步骤
-
查看文件信息
-
使用ida打开以后发现是cpp的
-
读取了9次输入
-
调用
lambda
函数,执行数据加密,点进去发现是异或数据- 碰到这种有
operator
表示是执行函数,双击进去看具体内容即可 - 发现是异或
1
-
在循环中对每个字符串再次调用
lambda
,进行字符替换-
-
同样双击进去以后按
R
键将数值替换为字符,查看其替换内容-
-
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
查看引用以找到其初始化的位置,得到初始化值-
-
-
-
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逆向-常用的逆向工具 提取码: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题的玩法