0%

[[VNCTF 2025]AndroidLux 那个伊蕾娜厨出的

2025-12-12 15:53By
Eanzcan
REVERSE

Problem: [VNCTF 2025]AndroidLux

思路

  • 解题大致思路

  • AndroidLux是Android应该这是导入数据lux是加密算法(猜想)

  • 063cd919cb.jpg

  • 976dd2069a.jpg

  • 上网查了一下env有能是环境文件

  • env可以用linux的file 命令看一下

  • ddd6c5ed0d.jpg

  • 有诈env果然是一个xz压缩包

  • 我想出题人不是一个有良心的人一定还有炸

  • 55fd1d4145.jpg

  • 26b6b578de.jpg

  • 查了一下Linux文件系统的常用目录和作用(usr和root,)用

    tar -xf env
  • 来解压env

    • 8e366c638e.jpg

    ff506accd2.jpg

    打开root找到真正的的env文件可以用Linux运行的的文件

    查壳 ida 一条龙
    d17e5b382e.jpg

    mian函数呢!!!!!!!!!!!!!
    58d14c1527.jpg

    只有汇编??
    明显不可能 阴险的出题人想考汇编应该是花指令or反编译(不过藏的好)

    da86ef34b3.jpg

    还考了一个ida的特性不会自动计算 sqrt,一般来说nop了可以反编译,but我的ida不行😭

    直接看汇编

    654dbc1c4b.jpg
    提取未知字符串:从二进制 0x1488/0x14A0 地址处提取unk_1488/unk_14A0的实际内容

    Base64 反向推导:截取固定字符串前 52 字节 → Base64 解码 → 得到客户端需输入的原始字符串
    数值验证:若题目修改 x/y,需满足x²+y²>36(如 x=5,y=4 → 41>36),触发0xBC614E跳转

    8c65465792.jpg

    还是特殊的base64

    2a87b84738.jpg

    现在差一个用户数据
    rootfs 一般是脚本构建的,so出题人改过的文件的日期是有问题的

    find . -type f -printf "%T@ %p\n" | sort -nr | head -10 | cut -d'' -f2-(本人看完汇编脑子已经没了所以我只看10条建议看多点)

    36e80ec41a.jpg

    1737084723.0000000000 ./usr/libexec/libexec.so这是用户数据

  • 直接ida

  • d84092b359.jpg

  • ac94ce8fa2.jpg

  • 二个劫持函数

客户端发送原始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}")

总结

  • 对该题的考点总结
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论