Try   HackMD

wordle 是什麼

wordle 是一種字謎遊戲,每天都會有一個五個字母的英文單字做為答案,每一輪可以猜一個英文單字,系統會告訴你猜中哪幾個字,以及哪幾個字位置是錯的,以及哪些沒猜中,然後作為線索繼續往下猜,共有六次機會

前言

老實說當初只是想把 wordle 的字庫拉出來做個幫助猜字的工具而已,沒想到會意外的發現 wordle 網站的秘密。
說了一堆遊戲規則這邊沒打算教你要怎麼正確的玩這個遊戲,因此想研究玩遊戲方法的可以關閉分頁離開了,這篇的目的是解析 wordle 網頁背後的秘密。

如何破解

首先打開 wordle 網頁,把原始碼拿出來看之後會發現他有載入一個 js 檔案

// https://www.nytimes.com/games/wordle/main.4d41d2be.js
...
var Ma=["cigar","rebut","sissy","humph","awake","blush",...]
var Oa=["aahed","aalii","aargh","aarti","abaca","abaci","abacs","abaft","abaka","abamp","aband",...]
...

當中可以看到兩 list 一個照著字母排列,另一個沒有,這邊可以稍微猜一下,沒事幹嘛拆成兩個 list,其中一個 list 是照字母順序排列,另一個則沒有,於是把前幾次的答案拿進去搜,結果發現答案都在 Ma 裡面,而且 index 位置還是跟 wordle 的第 N 個題目一樣,那結果很明顯了,每天答案就會是 Ma[題目編號]。
後來 wordle 出了許多的變種,同樣的做法可以套用到所有的 wordle 系列的遊戲
然後我就再也不完 wordle 了 QQ

延伸-如何玩 passwordle

這也是 wordle 的其中一個變種,但有趣的是他的答案是 random 的,每次進入網站答案都不一樣,所以大家一起玩是不會有共同答案的,而且他也是輸入一個字串,他會回傳 sha256 的結果並告訴你 hash 的哪邊不符合,想當然,這種方法用完 wordle 的方式會猜到天花地老,於是我又去看人家原始碼了XDD

// https://rsk0315.github.io/playground/js/passwordle.js
function randomPassword() {
    let letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let digits = '0123456789';
    let punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
    let s = letters.repeat(7) + digits.repeat(4) + punctuation.repeat(3);
    let length = 14;
    let res = Array.from({length}, (() => s[randomInt(s.length)])).join('');
    debugger; // どうぞ
    return res;
}

一進來就先看 randomPassword 的是如何產生的,而注意到了他其實有塞了一段debugger; // どうぞ,看起來就是要請我用,當然我也毫不客氣打開了 chrome 檢查工具,然後重新整理網頁,由於他在 function 內有塞斷點的關係在網頁載入的時候程式執行會停在那個位置,因此就可以先檢視 res 的變數內容,最後就得到我們要的答案了。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

reference

  1. wordle
  2. passwordle