WeChall - 2013 New Years Special
Challenge
URL:
https://www.wechall.net/en/challenge/quangntenemy/2013NYS/index.php
题面说 Santa、Rudolph 和其他角色之间有被截获的邮件,并附上收件人的 public key。目标是从两阶段的 crypto challenge 中恢复最终 solution。
第一阶段:已确认通过
从公开源码 index.php 可以看到,第一阶段把用户提交的
answer 与 secret1.php
的返回值比较。源码中的固定答案为:
1 | IKnowWhatYouDidThere |
使用当前 WeChall session 提交后,服务器将流程推进到:
1 | stageTWO222.php |
因此这不是猜测结果,而是已经通过服务器跳转确认的阶段一答案。
Public key 观察
从 stage 2 页面取得了 key1.key 和
key2.key。两份 key 的 gpg --list-packets
输出都显示 RSA public key,pkey[0] 标为 1024
bits,pkey[1] 标为 15 bits。key 的
MPI/模数中故意嵌入了可读字符串:
- key1 开头重复出现
TheSolutionIsIKnowWhatYouDidThere; - key2 开头重复出现
WhatAreYouWaitingForNothingHereMoveAlong。
这些字符串是题目设计的线索/填充,不应直接替代第二阶段 solution。仅把
key2 中的 WhatAreYouWaitingForNothingHereMoveAlong 作为
answer 提交,服务器没有接受。
第二阶段源码
stageTWO222.php 的核心流程是:
- 从
secret.php取得$secret; - 计算
$SOLUTION = WC_CryptoChall::generateSolution($secret, true); - 处理 answer 时,将该 solution 的 hash 写入 challenge;
- 访问
?santa=clause.json时,向当前用户的 valid mail 发送加密邮件; - 邮件正文包含
$SOLUTION,附件名为0xdeadc0de.asc,内容是key2.key。
访问 ?santa=clause.json 后页面返回 mail-sent
消息,但当前账号没有可直接读取的 valid
email,因此还没有拿到加密邮件正文,也没有完成第二阶段解密。
当前状态
第一阶段已通过;第二阶段未解决。最终 solution 仍需从邮件正文或等价的 RSA/PGP 逆向路径恢复。没有把 public key 中的提示字符串误标为最终答案。
后续路线
- 取得当前账号 valid mail 的可读投递路径,保存原始加密邮件和
0xdeadc0de.asc。 - 从
gpg --list-packets和实际邮件 recipient 确认使用的是哪一把 key。 - 按题目提示检查小 RSA modulus、低指数和错误生成的 key;不能只看两个 key 是否共享 gcd。
- 解出邮件正文后,再提交第二阶段 solution,并用
/en/challs验证 solved 状态。