0xGame 2024 WriteUp
Crypto
Coppersmith-I
这道题直接算小根算不出来,需要设置参数epsilon=0.01,可以算到248位,剩下的5位就只能枚举了。
1  | N = 135500646574582511239845764710311769260801998982429500680171919823431178899526463566215834234383331374445093363969218810906991784569340270510936759183504496584225937614940086329775325893307453919055830270986601152002191368431527285285313669979358099782497422114870417519470053198217401297960844455029559146309  | 
将上面输出放进下面的代码解出明文。
1  | from Crypto.Util.number import *  | 
RNG
这道题比较像逆向,RNG先通过种子生成初始状态,再用twist处理,最后用一系列位运算得到随机数。
twist操作会损失原数据的,在逆向时只能获得原始mt除了seed以外的数,所以应用mt[1]反推seed。同时逆向得到的seed不一定是唯一的,可能会出错,只能多试几次。
1  | from Crypto.Util.number import inverse  | 
SIDH
这道题实测用sageMath9.3去参数后算不出来,必须安装sageMath10.4
这题题目给的代码可以直接拿来用,传了参数就有了
1  | ┌──(root㉿Spreng)-[~]  | 
Reverse
MineSweeper
Unity逆向工具:dnSpy、AssetRipper
先用dnspy打开Assembly-CSharp.dll Update() 打通第二关会给flag
下面用C语言呈现flag的解密过程:
1  | 
  | 
相关数据一个是key = “0xoX0XOxOXoxGAME”
还有一个array用AssetRipper打开resources找到<TextAsset>enc:
E!>\u0008W1\tMBEBD]ZKKRV\u0016DfEl@WD35Qu\rX\u0015q\u0011\u001B\u000B\u0008v\u0004O\\h<
后面还有提示Maybe your flag is hidden here
PyPro
先使用pyinstxtractor提取PyPro.exe,再用在线网站反编译PyPro.pyc,得到源码一部分:对输入的flag加密
不难猜测后面的内容应该是对比密文是否一致,用记事本打开得到这一行:
1  | format error? z@2e8Ugcv8lKVhL3gkv3grJGNE3UqkjlvKqCgJSGRNHHEk98Kd0wv6s60GpAUsU+8Qu  | 
密文应是2e8Ugcv8lKVhL3gkv3grJGNE3UqkjlvKqCgJSGRNHHEk98Kd0wv6s60GpAUsU+8Q,解密即可
1  | import base64  | 
Tea2.0
本题中的data在程序执行中被回调函数修改过,即先用处理后的key1对data先tea加密一次,再对输入的flag tea2.0加密。
只需对data先tea加密,再tea2-de解密即可,解密依然是反转加密函数的代码
1  | 
  | 
EzAndroid | Review
后悔没做这道签到题,在 jadx 中搜一下就能找到 J6IwkwOvgGFthiofcwab0ka7KrOMpVbfROQ9Jh5C5YMqfyLLdMrNoj4YGVh
base62 解码得到 0xGame{caff454e-2238-42aa-a75a-75e9f5f1f769}
Register | Review
看官方的 WP 程序居然能跑起来?但附件由于缺少 dll,根本跑不起来。
分析一下程序,已知 Str 是 0xGameUser,先异或一个 v7,再进行哈希。

v8 就是 time(0),不放源码了,算 v7 有一个小坑,你看调用的时候是 0x1C、v8 的顺序,到这个函数之前有个函数偷偷把两个参数换了一下位置。因为逆向经常见到这种一个调用一个而不是直接调用的情况,我当时一直都没发现导致卡死了:cry:。
 带入后发现很简单 v7=time(0)>>28,算出来是 6

哈希这部分可以直接拿过来用,或者查一下 CryptCreateHash 就会发现 0x8004u 对应 SHA-1 算法,可以用
1  | CryptCreateHash(phProv[0], 0x8004u, 0, 0, phHash);  | 
算出来:
1  | 
  | 
