WeChall - Impossible n'est pas français

Challenge

题目要求将一个 170+ 位的大整数分解质因数,限时 6 秒。

Solution

直接分解这么大的数是不现实的。但题目有一个关键缺陷:提交错误答案后,服务器会在错误信息中泄露正确的答案,并且挑战数字保持不变。

所以解法分三步:

  1. 请求一个新数字
  2. 提交任意错误答案(如 solution=1)→ 服务器返回 Correct would have been "xxx"
  3. 用泄露的正确答案重新提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests, re

cookies = {'WC': 'YOUR_WECHALL_COOKIE'}
base = 'https://www.wechall.net/en/challenge/impossible/index.php'

# Step 1: request new number
r = requests.get(f'{base}?request=new_number', cookies=cookies)
csrf = re.search(r'name="gwf3_csrf" value="([^"]+)"', r.text).group(1)

# Step 2: submit wrong answer to leak the correct one
r2 = requests.post(base, data={
'solution': '1',
'solve': 'Submit',
'gwf3_csrf': csrf
}, cookies=cookies)
correct = re.search(r'Correct would have been "(\d+)"', r2.text).group(1)

# Step 3: submit the correct answer
r3 = requests.post(base, data={
'solution': correct,
'solve': 'Submit',
'gwf3_csrf': csrf
}, cookies=cookies)

print("Solved!" if 'correct' in r3.text.lower() else "Failed")