Последний вопрос (The Last Question)
Последний вопрос (The Last Question)
Platform: hackerlab | Category: Misc | Type: Challenge | Difficulty: Easy | OS: NA | Author: XESXOR | Date: 2025-12-25 | Status: Solved Techniques: ascii_code_decoding, client_side_data_analysis, google_forms_data_extraction
Summary
Task: Google Form with hidden data in client-side JavaScript. Solution: Extract FB_PUBLIC_LOAD_DATA_ variable from page source and decode comma-separated ASCII codes to get the flag.
Последний вопрос — hackerlab
Description
"Ты не можешь получить правильные ответы, если у тебя нет правильных вопросов"
Link to Google Form: https://docs.google.com/forms/d/e/1FAIpQLSf1TPaUeq68KoBjThBinu0u5FEosLq1llykroSbelbW7EuPpg/viewform?usp=sf_link
Analysis
The task name "Последний вопрос" (The Last Question) is a reference to Isaac Asimov's short story "The Last Question", and also a hint that we need to look for data about "questions" in the form's source code.
Google Forms stores the form structure and validation data in client-side JavaScript in the FB_PUBLIC_LOAD_DATA_ variable.
Solution
Step 1: Analyzing the page source code
Open the Google Form and view the page source (Ctrl+U or View Source).
Search for the FB_PUBLIC_LOAD_DATA_ variable — this is a JavaScript object containing the entire form structure.
Step 2: Extracting hidden data
In the form data we find:
- Question: "Где расположена Земля Санникова?" (Where is Sannikov Land located?)
- Expected answer: "Unfortunately, it never existed. It's all the ice's fault :("
- Hidden string:
67,79,68,69,66,89,123,108,52,115,116,95,113,117,51,115,116,49,111,110,95,119,52,115,95,104,52,99,107,101,100,125
Step 3: Decoding ASCII
The comma-separated numbers are ASCII character codes:
python read-only • copy allowed#!/usr/bin/env python3 data = "67,79,68,69,66,89,123,108,52,115,116,95,113,117,51,115,116,49,111,110,95,119,52,115,95,104,52,99,107,101,100,125" ascii_codes = [int(x) for x in data.split(',')] flag = ''.join(chr(c) for c in ascii_codes) print(flag)
Or as a one-liner:
python read-only • copy allowedprint(''.join(chr(int(x)) for x in "67,79,68,69,66,89,123,108,52,115,116,95,113,117,51,115,116,49,111,110,95,119,52,115,95,104,52,99,107,101,100,125".split(',')))
Manual decoding
| ASCII | Symbol |
|---|---|
| 67 | C |
| 79 | O |
| 68 | D |
| 69 | E |
| 66 | B |
| 89 | Y |
| 123 | { |
| 108 | l |
| 52 | 4 |
| 115 | s |
| 116 | t |
| 95 | _ |
| 113 | q |
| 117 | u |
| 51 | 3 |
| 115 | s |
| 116 | t |
| 49 | 1 |
| 111 | o |
| 110 | n |
| 95 | _ |
| 119 | w |
| 52 | 4 |
| 115 | s |
| 95 | _ |
| 104 | h |
| 52 | 4 |
| 99 | c |
| 107 | k |
| 101 | e |
| 100 | d |
| 125 | } |
Notes
- Google Forms stores validation data (including correct answers) in client-side JavaScript
- The
FB_PUBLIC_LOAD_DATA_variable contains the complete form structure - This is a known feature of Google Forms — answers to quiz forms can be extracted from the source code
- The name "The Last Question" is a double hint: to Asimov's story and to searching for question data in the code