Atri的Re之旅(1)
test1:speed
1,die查壳,发现无壳
2,运行exe,发现打开后迅速结束窗口
3,打开ida
4,追踪WinMain函数,发现sleep(1u),设下断点
5,动态调试
test2:base
1,die查壳:无壳的PE64文件
2,虚拟机运行,发现需要填写flag
3,打开ida
4,Main函数:
5,用cyberchef翻译base64
test3:catch
1,打开ida,查找可疑字符串
2,发现字符串位数与moectf{}一致,怀疑是凯撒密码,解密后得到flag
test4:upx
1,根据题目提示,die查壳
2,upx去壳
3,打开ida,查找可能的字符串,最后发现核心加密在main函数
4,分析函数,先寻找密文
5,将密文重新组合后写出脚本
1 | #include <bits/stdc++.h> |
test5:ez3
1,打开ida,我们发现主函数前面的部分用来检测格式是否为moectf{}
2,然后将去除moectf{}的字符串传入check,进行加密,最后与密文比对


3,写出求解的Z3脚本
1 | from z3 import * |
test6:ezandroid
1,打开jadx,加载apk,进入主函数
2,发现是base64,直接cyberchef解密

test7:flower
1,打开ida,先查找可疑的字符串
2,跳转过去,发现无法编译
3,找到花指令,清除花指令

4,发现核心逻辑在solve函数,即flag[i]^key=enc[i]
5,写出解密脚本,发现结果不对,怀疑是key出问题了,动态调试一下,发现有反调试,绕过
6,获取key值
7,写出真解密脚本
1 | #include <stdio.h> |
test8:2048_master_re
1,=,打开ida,查一下可疑字符串,我们发现这一条:
2,点击进去查引用,我们发现这个函数:sub_401C83
3,不难看出这个函数是用来最后检验的
4,点击进去,找到主验证逻辑:sub_401A81,然后找出最后要比对的密文

5,点进去,我们发现一共有三部分,最后需要的是加密完的block



6,我们发现这是xxtea加密,写出脚本,得到结果
1 | #include <stdio.h> |
1 | moectf{@_N1c3_cup_0f_XXL_te4_1n_2O48} |
test9:A cup of tea
1,查字符串,核心函数为sub_1400162E0和sub_14001109B

2,进入sub_14001109B,发现是一般的tea加密,写出求解脚本即可
1 | #include <stdio.h> |
1 | moectf{h3r3_4_cuP_0f_734_f0R_y0U!!!!!!} |
test10:ezpy
1,发现是pyc文件,去在线网站,获取原代码
2,发现格式和凯撒密码相似,直接得到解
test11:hava_fun
1,追踪核心函数,发现Func函数

2,发现是简单的异或,求解即可
1 | #include <stdio.h> |
1 | moectf{H@v4_fUn} |
test11:mazegame
经典maze,找出地图,交给ai即可
1 | import collections |
1 | moectf{ssddddwwddssddddssddssssddwwddwwddwwwwddddssssaassssaaaassaassaawwaawwwwaaaassddssaassddssssaaaassddddddwwwwddddssddddwwddwwaawwddddssssssssssssaaasssdddssssaassssaaaassaassaawwaawwwwaaaassddssaassddssssaaaassddddddwwwwddddssddddwwddwwaawwddddssssssssssssaaawawwwaassaawwaassaaaaaaaaaawwwwaassssssddddssssssdddddddddwwdddssddwwwdddsssdddddwwawwddddddddddddddddddddssddddddddwwwwawwwwwwwwdwwwwwwwwwwwaawwdwwwwwwwwwwdwwwwwwaaaasssssssssssssssssssssssssssssssssssssaaawwaaaaaaaaaaaaaaaaaaawwwddddddddwwddddddddddwwwawaawawwwwwwwwwwwwwddwwwwaassaawwaassaaaaaaaaaawwwwaawwddwwaawwdwwwdwwwwddddddddddssddddssssdsdssddssaassaaaawwaaaassssaaaaaawwddddwwwwaawwawaassdsssdd} |
test12:upx_revenge
1,查了一圈,发现是UPX!被删了,加上就可以正常upx -d脱壳了

2,进入ida,发现密密麻麻的写了很多,不过看到类似于base64的密文,用一般密文表解密发现是乱码
3,找到被加密的base64字母表,bloc异或了一个0xE,可以通过动调取得block

4,可以通过给密文异或的方式来代替给字母表异或
1 | #include <stdio.h> |
1 | bW9lY3Rme1kwdV9SZTRsMXlfRzAwZF80dF9VcHghISF9 |
5,正常解码即可
test13:guess
1,直接反编译发现失败,可以看见是花指令,全nop就可以了


2,发现其实就是随机生成一个数,比对正确后就输出flag
3,下个断点获取数,输出即可


test14:A simple program
1,进入ida,发现直接有个flag,不过是错的
2,查str2的调用,发现还有一个加密,写出脚本即可

1 | #include <stdio.h> |
1 | moectf{Y0u_P4ssEd!!} |
test15:Two cups of tea
1,两个tea加密,第一个可以直接动调获得结果



2,看着有点绕倒过来解密就行
1 | #include <stdio.h> |
1 | moectf{X7e4_And_xx7EA_I5_BeautifuL!!!!!} |
test16:ezandroid.pro
1,jadx打开,看主函数,发现核心是so文件的check函数
2,解压,在ida中打开so文件,进入check函数,注意到其中有SM4,怀疑是SM4加密
3,发现没有传入IV,怀疑是ECB,直接cyberchef一把梭
test17:rusty_sudoku
1,rust语言写出来的数独,直接字符串查找+在线工具求解后输入即可


