← Back to Writeups
CUSTOMEasyMisc

Последний вопрос (The Last Question)

XESXOR9/2/20263 min read
#misc#custom#easy#ascii_code_decoding#client_side_data_analysis#google_forms_data_extraction

Последний вопрос (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
#!/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
print(''.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

ASCIISymbol
67C
79O
68D
69E
66B
89Y
123{
108l
524
115s
116t
95_
113q
117u
513
115s
116t
491
111o
110n
95_
119w
524
115s
95_
104h
524
99c
107k
101e
100d
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 ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍