TGCTF Reverse 方向复现
base 64
变种 base64
1 |
|
得到flagHZNUCTF{ad162c-2d94-434d-9222-b65dc76a32}
XTEA
- 种子确定,拿到key
1 |
|
解密脚本
1 |
|
得到flagHZNUCTF{ae6-9f57-4b74-b423-98eb}
水果忍者
- Unity游戏的核心逻辑通常由C#脚本编写,编译后会被打包到 Assembly-CSharp.dll;该文件位于游戏目录的 <游戏名>_Data\Managed\ 下,如本题在 \水果忍者\Fruit Ninja_Data\Managed\Assembly-CSharp.dll 中
- 用
dnSpy
打开 Assembly-CSharp.dll,在 GameManager 里面找到:
在 Decrypt 里看到是 AES 加密,而密文、密钥、iv 在下面都能找到
CyberChef 解密
flag为HZNUCTF{de20-70dd-4e62-b8d0-06e}
蛇年的本名语言
pyc
: 脚本文件编译得到的字节码, 二进制文件pyd
: 基本的Windows DLL文件, python的动态链接库- 用
pyinstxtractor
解包 exe 文件,把 pyinstxtractor.py 和 output.exe 放在同一目录下,执行
1 |
|
解包后发现是 pyc,用 https://tool.lu/pyc 解密 output.pyc,得到的代码变量命名被混淆
稍微修改一下
1 |
|
一眼 z3, 111111116257645365477364777645752361
即密文,每个数字代表一个字符出现的次数
z3 求解
1 |
|
output:
Flag is: H1Z1N1U1C1T1F1{1a6d275f7-463}1
可以看到这里的一一对应关系 HZNUCTF{
对应11111111
,仍然回到这串数字111111116257645365477364777645752361
,可以得到映射表 ‘6’->’a’,’2’->’d’,’5’->’7’,’7’->’f’,’4’->’-‘,’3’->’6’,’1’->’}’
继续求解
1 |
|
得到flagHZNUCTF{ad7fa-76a7-ff6a-fffa-7f7d6a}
conforand
- 直接用 ida 打开发现有 ollvm 混淆,用
D-810
先去混淆,从给出的符号表看到是 rc4 加密
1 |
|
看传入的每个参数分别代表什么,往上看
大致为
1 |
|
密文长度为42个字节,密钥长度为9字节,即JustDoIt!
2. 在init
中的sub_5s5s5s
里初始化随机数种子并传入密钥
1 |
|
在init_sbox
中调用rand()
函数,种子不确定,rand()也只调用了这一次
rc4 算法中包含一个 S 盒,是一个含有 256 个元素的数组,其中的每个元素都是一个 8 位无符号整数,即 0-255 范围内的值,rand()函数被用来影响 S 盒的初始化过程,hook rand()函数尝试爆破
1 |
|
- 在linux环境运行 开虚拟环境装frida
1 |
|
得到flagHZNUCTF{489b88-1305-411e-b1f4-88a3070a73}
exchange
直接扔 ida 发现有壳,upx 工具去壳之后再打开,直接看没看出加密类型,用
Findcrypt
插件找到一个DES_sbox,基本确定是 DES 加密,x 交叉引用能一直跳到主函数那里
Source 必须有至少 41 字节,否则 Source + 40 会越界访问,输入的flag形式必须是HZNUCTF{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx},中间部分长度为32个字节,否则程序会退出第一个 for 循环对输入的{}中的字符进行处理,处理的结果存入 v12
进入加密部分由于 DES 的密钥是在加密前初始化好的,在 input 第一次传入前的函数动用处打断点,动调找密钥
把 key 形式改 Q_word(64位) ,并且 Array size 改成32之后,能明显看到前后对称,而DES 的解密方式是16个子密钥倒着使用,于是直接修改寄存器(RCX)值,在原来的基础上加128(16*8),接着把密文 patch 到 input 里,直接运行解密找到解密后的字符,导出为 hex string(unspaced),
最后解密
1 |
|
flag即为HZNUCTF{391ds2b9-9e31-45f8-ba4a-4904a2d8}