CTF逆向-[CISCN2018]2ex-WP_mips-32架构以及base64换表
来源:https://buuoj.cn/
内容:无
附件:https://pan.baidu.com/s/1coGRxCdGn95Ink8mDL9wcQ?pwd=o2f3 提取码:o2f3
答案:flag{change53233}
总体思路
mips-32架构,尝试简单逛逛先,实在不行再用其他工具。
发现了疑似base64的算法
通过换表算法解决
详细步骤
- 检查文件信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XedTfSsb-1648200180609)(https://raw.githubusercontent.com/serfend/res.image.reference/main/image-20220325162706066.png)]
- 是mips-32架构的,这种架构在ida7.5以后似乎分析的还行。也看到有使用jeb这种安卓逆向工具去逆伪代码的。此处我们还是使用ida。
对于MIPS架构的逆向,可以参考一下素材:安装专用工具retdec,jeb-mips
详细内容见博客
-
通过start函数中的
sub_4013D8(f_main, a5, (int *)va, init_proc)
找到main方法入口 -
发现内部有四个方法,逐一点开,直到看到第三个中存在一些静态数据的调用。
- 根据余3、余2和1这样的运算,以及
=
字符,猜测是base64 - 双击进入g_key,按下
Shift+E
获取其值。猜测是base64换表
-
-
尝试将输出的值恢复为换表前的base64,然后解码,得到答案
-
import base64 # output = "│_r-+_Cl5;vgq_pdme7#7eC0=" 会报错 output = "_r-+_Cl5;vgq_pdme7#7eC0=" raw_table = "@,.1fgvw#`/2ehux$~\"3dity%_;4cjsz^+{5bkrA&=}6alqB*-[70mpC()]89no" def switch_base64_table(raw_table, output): base64_default_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" if len(raw_table) < len(base64_default_table): raw_table = str.ljust(raw_table, len(base64_default_table), '?') print(f'length not enough,padding:\n{raw_table}') char_map = str.maketrans(raw_table, base64_default_table) trans = output.translate(char_map) result = base64.b64decode(trans) return result result = switch_base64_table(raw_table, output) print(result) # b'flag{change53233})'
参考文档
- CSDN-MIPS逆向经验
- 中国某省队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
,需要跳过去
- 注意观察会执行的反调试分支,例如出现
-