Problem: [VNCTF 2025]AndroidLux
思路
-
解题大致思路
-
AndroidLux是Android应该这是导入数据lux是加密算法(猜想)
-

-

-
上网查了一下env有能是环境文件
-
env可以用linux的file 命令看一下
-

-
有诈env果然是一个xz压缩包
-
我想出题人不是一个有良心的人一定还有炸
-

-

-
查了一下Linux文件系统的常用目录和作用(usr和root,)用
tar -xf env -
来解压env
-

打开root找到真正的的env文件可以用Linux运行的的文件
查壳 ida 一条龙

mian函数呢!!!!!!!!!!!!!

只有汇编??
明显不可能 阴险的出题人想考汇编应该是花指令or反编译(不过藏的好)
还考了一个ida的特性不会自动计算 sqrt,一般来说nop了可以反编译,but我的ida不行😭
直接看汇编

提取未知字符串:从二进制 0x1488/0x14A0 地址处提取unk_1488/unk_14A0的实际内容Base64 反向推导:截取固定字符串前 52 字节 → Base64 解码 → 得到客户端需输入的原始字符串
数值验证:若题目修改 x/y,需满足x²+y²>36(如 x=5,y=4 → 41>36),触发0xBC614E跳转
还是特殊的base64

现在差一个用户数据
rootfs 一般是脚本构建的,so出题人改过的文件的日期是有问题的find . -type f -printf "%T@ %p\n" | sort -nr | head -10 | cut -d'' -f2-(本人看完汇编脑子已经没了所以我只看10条建议看多点)

1737084723.0000000000 ./usr/libexec/libexec.so这是用户数据
-
直接ida
-

-

-
二个劫持函数
客户端发送原始Flag
↓
read函数劫持 → 逐字节异或1(0x1)
↓
服务器对异或后的数据做「自定义Base64编码」
↓
strncmp函数劫持 → 对Base64串做「条件ROT13替换」
↓
与MM_STR比较 → 匹配则返回ok
ok写解密脚本了最好是c,python的base64要注意一下
EXP
- 具体攻击代码
-
def rot13_c_style(s): result = [] for c in s: if c.isalpha(): base = ord('a') if c.islower() else ord('A') new_char = chr(((ord(c) - base + 13) % 26) + base) result.append(new_char) else: result.append(c) return ''.join(result) def decode_base64_c_style(encoded_str, custom_table): char_to_idx = [0] * 129 for idx in range(64): c = custom_table[idx] char_to_idx[ord(c)] = idx encoded_len = len(encoded_str) decode_buf_size = (encoded_len // 4) * 3 + 1 decode_buf = bytearray(decode_buf_size) k = 0 for i in range(0, encoded_len, 4): c1 = encoded_str[i] if i < encoded_len else '=' c2 = encoded_str[i + 1] if (i + 1) < encoded_len else '=' c3 = encoded_str[i + 2] if (i + 2) < encoded_len else '=' c4 = encoded_str[i + 3] if (i + 3) < encoded_len else '=' idx1 = char_to_idx[ord(c1)] if ord(c1) < 129 else 0 idx2 = char_to_idx[ord(c2)] if ord(c2) < 129 else 0 idx3 = char_to_idx[ord(c3)] if ord(c3) < 129 else 0 idx4 = char_to_idx[ord(c4)] if ord(c4) < 129 else 0 decode_buf[k] = (idx1 << 2) | (idx2 & 0x03) k += 1 if c2 == '=': break decode_buf[k] = ((idx2 >> 2) << 4) | (idx3 & 0x0f) k += 1 if c3 == '=': break decode_buf[k] = ((idx3 >> 4) << 6) | idx4 k += 1 if c4 == '=': break decode_buf = decode_buf[:k] return bytes(decode_buf) CUSTOM_BASE64_TABLE = "TUVWXYZabcdefghijABCDEF456789GHIJKLMNOPQRSklmnopqrstuvwxyz0123+/" MM_STR = "RPVIRN40R9PU67ue6RUH88Rgs65Bp8td8VQm4SPAT8Kj97QgVG==" if __name__ == "__main__": mm_rot13 = rot13_c_style(MM_STR) print(f"1. ROT13处理后的mm字符串:\n{mm_rot13}\n") base64_decoded = decode_base64_c_style(mm_rot13, CUSTOM_BASE64_TABLE) print(f"2. Base64解码后的字节(16进制):\n{base64_decoded.hex()}\n") final_flag = [] for b in base64_decoded: final_flag.append(chr(b ^ 0x1)) final_flag_str = ''.join(final_flag) print("===== 最终解密结果 =====") print(f"正确Flag:{final_flag_str}")
总结
- 对该题的考点总结

