IRCPuzzles is an IRC-based puzzle game hosted every year on April 1st. The event lasts for several days. The answers are keys to channels and contestants progress from the first level to the final level. The levels usually get progressively harder. Each level is solvable with the original clue alone, but additional hints are added later if the contestants are stuck on a level for long.
Since I enjoy solving puzzles and challenges, I usually participate in this event every year. Cluelessly staring at a vague hint for hours, relentlessly going down multiple rabbit holes, the joy of finally finding a solution… what’s not to love? After all, this is fairly similar to a regular day in information security. I decided to check out this year’s puzzles.
For those who are unfamiliar with IRC:
- IRC is a text-based chat system for instant messaging. You can connect to an IRC server using an IRC client.
Channel
refers to an IRC channel. This is similar to a channel/group on messaging apps.Topic
refers to the IRC channel’s title. The information regarding a level is given in the corresponding channel’s topic.Key
refers to the secret channel key (similar to a password) that’s required to join the next level’s channel. You get this by solving the previous level.
The Tips page on the IRCPuzzles website contains more helpful information regarding the challenge format:
- The clue is, by itself, the main puzzle for each level.
- The hints are to help point you in the right direction with the clue.
- Channel keys only contain the following characters:
[a-z0-9]
. Solutions have spaces and dashes stripped, soFrench Revolution
becomesfrenchrevolution
andVoight-Kampff
becomesvoightkampff
Table of Contents
This post is fairly lengthy, so you can browse puzzles based on your interest:
- Level 0:
#misc
,#cryptography
- Level 1:
#misc
,#cryptography
- Level 2:
#rome
- Level 3:
#unicode
- Level 4:
#date
,#timestamps
- Level 5:
#dns
,#unicode
,#utf8
- Level 6:
#space
- Level 7:
#morse
,#audacity
- Level 8:
#space
,#expedition
,#exif
- Level 9:
#barcodes
,#math
,#date
- Level 10:
#chess
,#coordinates
,#unicode
,#utf8
- Level 11:
#nonogram
,#barcode
- Level 12:
#image-manipulation
,#plane
- Level 13:
#cryptography
,#wordle
- Level 14:
#emoji
,#cryptanalysis
- Level 15:
#infosec
,#wireshark
,#networking
- Level 16:
#chemistry
- Level 17:
#nonogram
Level 0
This is where the event begins. I joined the channel, and found the following channel topic:
https://ircpuzzles.org/ | 2022 AFPC has begun, first clue is: aGlzdG9yeQ== | #ircpuzzles-2022-afpc-01 is the first channel | #ircpuzzles-chat for off-topic chat | Rules: https://blog.ircpuzzles.org/rules.html | Tips: https://blog.ircpuzzles.org/tips.html
As an IRCPuzzles tradition, the first challenge is usually a base64-encoded string:
$ echo "aGlzdG9yeQ==" | base64 -d
history
The answer (key to the next level) was history
. I joined level 1 with /join #ircpuzzles-2022-afpc-01 history
.
Level 1
Channel topic:
Welcome to Level 01 of #ircpuzzles || Clue(s): MKMyoaD=
The string looked like base64. However, given the first couple of levels of AFPC have involved ROT13 in some fashion in previous years, I applied ROT-13 decoding on the string:
$ rot13 MKMyoaD=
ZXZlbnQ=
The output looked like another base64 string, so I decoded it like before:
$ echo "ZXZlbnQ=" | base64 -d
event
That wasn’t very hard!
Level 2
Channel topic:
Welcome to Level 02 of #ircpuzzles || This year’s theme: Historic Moments & Personalities || Clue(s): ET TV | AVC || Hints: τέκνον | https://is.gd/89Qkyj
The first two levels were just introductory. The theme for this year (Historic Moments & Personalities) looked pretty interesting. However, as I’m not a history nerd, I wasn’t sure whether it was going to be easy.
ET TV | AVC
didn’t give me any ideas on how to proceed. I thought I had to figure out what ET TV
meant and then apply AVC
to it. Advanced Video Coding (AVC) is a video compression standard, but I could not find any connection to ET TV
. ETTV was a torrent distribution group, so that appeared to make some kind of sense, but I ruled it out because it didn’t connect with the rest of the hints.
The hint picture given was of the Pantheon, which is a monument in Rome:
Googling for “avc rome” gave me https://en.wikipedia.org/wiki/Ab_urbe_condita. This was a method to represent a date in years since 753 BC, the traditional founding of Rome. The year 1 BC would be written AUC 753, and 2022 AD (current year) would be written AUC 2775. Furthermore, the hint τέκνον
translates to “child” — this did not seem particularly helpful.
I thought about ET TV
. Initially, I tried to relate Entertainment Tonight
(because it’s a TV channel) and Ab Urbe Condita / Rome; however, that proved fruitless. Then I went on multiple tangents about ET
: Economic Times
, Extra Terrestrial
, etc. But those were all dead ends.
After being stuck for a while, I read the Wikipedia article for Ab Urbe Condita and found that AUC is also abbreviated as AVC. If AUC
meant AVC
then ET TV
could mean ET TU
. Googling for “et tu + rome” gave me https://en.wikipedia.org/wiki/Et_tu,_Brute%3F. Et Tu
is a Latin phrase used to signify an unexpected betrayal by a friend. I was pretty sure this was the solution, but I wasn’t sure of the answer key.
I then remembered seeing a list of years and their corresponding AUC values in the “Ab urbe condita” Wikipedia article:
As ET TU
was said during the assassination of Julius Caesar, I tried the year of death as the answer: 710 AUC.
710
was the answer. I later found out that Caesar’s last words were supposedly καὶ σύ, τέκνον
(you too, child). Onto the next one!
Level 3
Channel topic:
Welcome to Level 03 of #ircpuzzles || Clue(s): 𒃲 𐦂 ♌︎
The clue was surprisingly brief. I found the meanings of each Unicode codepoint (they were Cuneiform symbols):
𒃲 = large/great/GAL
𐦂 = meroitic hieroglyphic letter i
♌︎ = leo
Googling for great eye leo
pointed me to Leo constellation, which also links to Rome, so I thought I was on the right track. However, none of the answers I tried from the constellation Wikipedia page worked. Then, googling Great i Leo
(the three unicode meanings) pointed me to https://en.wikipedia.org/wiki/Pope_Leo_I. Pope Leo I (also Leo the Great) was a Bishop of Rome. After learning a bit about Leo the Great, I went through https://en.wikipedia.org/wiki/List_of_stars_in_Leo:
I noticed each star had a symbol associated with it (second column). B stands for Bayer Designation Symbol.
From Wikipedia:
A Bayer designation is a stellar designation in which a specific star is identified by a Greek or Latin letter followed by the genitive form of its parent constellation’s Latin name.
I tried to see if the Bayer designation symbol somehow connects to any of the Unicode characters in the clue. Unfortunately, it did not.
Since a word could mean different things in different contexts, I might have taken the incorrect interpretation of the symbols. I looked at the alternate meanings of these words. Reading them out in order helped: GAL
+ i
+ leo
=> Galileo
. That was it! I ended up going the longer and more scenic route to arrive at the answer, but oh well.
Level 4
Channel topic:
Welcome to Level 04 of #ircpuzzles || Clue(s): -18697508872 | 선 || Hint(s): https://is.gd/2EAb41
Like the previous level, the clue was very short: -18697508872 | 선
. My first thought was that -18697508872
was a Unix timestamp (something I’ve written about on Stack Overflow years back — https://stackoverflow.com/a/20823376/1438393). 선
meant “good” or “line” in Korean.
The hint was a picture of a date fruit — this solidified my assumption that the clue string was a representation of a date or multiple dates.
I tried arranging 18697508872
as a sequence of dates: 186, 697, ..., 872
, 1869, 7508, 872
, etc. I was hoping to find some connection between those years. However, the second arrangement did not even make sense: 7508
is a year in the future!
I thought about how I could relate 선
to the years 186, 697, ..., 872
. However, after a quick investigation, I found that nothing notable happened in those years. Then I considered the meaning of 선
to be “line”. Accordingly, I looked into International Date Line, but that was hopeless.
Then I noticed the negative symbol on the date. I quickly went back to my original idea of the clue string being a Unix timestamp. Unix epoch starts in 1970, and the negative symbol meant I had to work backwards. There are 3.154e+7
seconds in a year, so I calculated the year as such:
>>> ((1970*3.154e+7)-18697508872)/3.154e+7
1377.1810757133799
It looked like I was getting somewhere! I googled 1377 korea
and found https://en.wikipedia.org/wiki/Jikji. And that was the answer.
Jikji is the abbreviated title of a Korean Buddhist document whose title can be translated to “Anthology of Great Buddhist Priests’ Zen Teachings”
Level 5
Channel topic:
Welcome to Level 05 of #ircpuzzles || Clue(s): https://clue.ircpuzzles.org
I visited the URL and was greeted by a funny meme:
Because of nightmares from some of the CTFs I’d played before, I attempted steganography on the image, but that turned up nothing.
I checked the page source:
<!DOCTYPE html>
<html lang=en>
<head>
<title>this title is not a clue</title>
</head>
<img src=dns.jpg alt="It's not DNS / There's no way it's DNS / It was DNS"/>
</html>
The title was demotivating. Then I thought of DNS. The usual place to put some text in DNS would be in the TXT record, so I queried it using dig
:
$ dig clue.ircpuzzles.org TXT +short
"\232\161\140\227\129\143\230\152\165\227\130\132 / \233\179\165\229\149\188\227\129\141\233\173\154\227\129\174 / \231\155\174\227\129\175\230\179\170"
I was getting somewhere. I knew I needed to convert this into something readable, but I did not know how to. I tried to interpret the text as ASCII (with a modulo) and some ciphers; unfortunately, that didn’t work. After some searching, I found https://utf8-chartable.de/unicode-utf8-table.pl?start=34816&utf8=dec which was a table containing Unicode code points ↔ UTF8 Decimal Points mapping. I Ctrl + F’d for 232 161 140
and found:
U+884C 行 232 161 140
Beautiful! It looked like each byte was represented separately. Now I just needed to decode the rest of the message. I used an online converter and got:
行く春や / 鳥啼き魚の / 目は泪
I removed the /
and translated 行く春や 鳥啼き魚の 目は泪
. I got:
The eyes of the spring and the bird-growing fish are tears
It’s a Haiku by Matsuo Bashō, a Japanese poet/saint!
Spring departs.
Birds cry
Fishes’ eyes are filled with tears
I tried basho
as the answer, and that worked!
Level 6
Channel topic:
Welcome to Level 06 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/sVYQbQNhpVMFGaHr0QNnqV9bHDdqss8c.jpg || Hint(s): https://is.gd/G7z7Fn
The picture was of Wright Brothers as kids and a Male
sign. The hint image was the cover of the “God of War - PS2” game.
I searched for Wright brothers + Male
+ war
, god of war
, and other combinations. I didn’t find anything useful. After some reading, I discovered a patent war involving the Wright Brothers. However, that wasn’t very useful either.
I went back to the clue string to see if I was missing something obvious. Sure enough, I was! I had assumed the third symbol was Male
, but after reading https://en.wikipedia.org/wiki/Male, I found the following:
The symbol of the Roman god Mars (god of war) is often used to represent the male sex.
I quickly googled Wright Brothers Mars
and found results about Ingenuity:
Ingenuity, the Mars Helicopter, has a tiny piece of the 1903 Wright Flyer on board.
ingenuity
was the answer!
Level 7
Channel topic:
Welcome to Level 07 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/uLRFzb5EIgHUk86uMOqefvBYXTvezAnb.mp3 | where? || Hint(s): https://is.gd/9rCiV6 || License Information: MrAuralization “Relay” https://freesound.org/people/MrAuralization/sounds/203600/ (adapted) CC-BY 3.0
The URL (https://files.ircpuzzles.org/2022/uLRFzb5EIgHUk86uMOqefvBYXTvezAnb.mp3) (archive link) was an audio file. The audio resembled morse (long and short sounds), but I was unable to make sense of it. I took a break and decided to revisit it later.
The next day, I listened to the audio again. The clue image said “two of them”:
I thought it meant that two of the consecutive sounds made up one character in the morse code. Upon listening carefully, I found that the audio resembled the sound of a clicky pen. The clue made sense — each character was represented by two sounds.
Manually decoding the sounds was going to be time-consuming and error-prone, so I decided to use the tool for the job: oh, the Audacity!
I opened up the audio file in Audacity:
For easier visualization, I changed the view to Spectrogram
, set Split Stereo to Mono
, and removed the second track. The spectrogram looked like this:
According to my theory, the dot was the two “lines” that appeared immediately next to each other, and the dash was the two “lines” that were slightly more distant:
It took me multiple listens to decode the audio to morse. Here was my first decoding:
.-- .... .- - .... .- - .... --. .. -.. .-- ... .. ..- --. .... .
I converted it to ASCII:
WHATHATHGIDWSIUGHE
WHAT HATH
was readable, but GIDWSIUGHE
did not make sense. Googling the output did not help either. Perhaps I’d made an error while decoding the Morse.
Indeed, I was not accounting for the minor delays in between two dots. After fixing that error, I got the output:
WHAT HATH GOD WROUGHT
In American morse, ..
is an I and . .
is an O. That was why my output did not make sense. Here’s an illustration that compares both versions:
I googled the phrase What hath God wrought
and found https://en.wikipedia.org/wiki/What_hath_God_wrought. I quickly learned this was the first Morse message transmitted to officially open the Baltimore–Washington telegraph line.
The answer was:
BaltimoreWashington
In retrospect, I could’ve found the solution by just googling what hath
but there’s no fun in that!
Level 8
Channel topic:
Welcome to Level 08 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/j80ubl60cyxqcy8cg9klkt3qkv0rhv1e.jpg | whodunit || Hint(s): meta
The clue image pointed to Interstellar. The other clue was whodunit
:
“A whodunit or whodunnit (a colloquial elision of “Who [has] done it?”) is a complex plot-driven variety of detective fiction in which the puzzle regarding who committed the crime is the main focus.”
I thought it was about the creators of Interstellar. One possible answer to the question “who done it?” was Christopher Nolan, the director of the movie. I spent some time connecting Nolan and the image itself, but I came up empty.
Then I searched interstellar + whodunit
and found an article on the NASA website with the title Hubble Solves Cosmic ‘Whodunit’ with Interstellar Forensics.
The article mentioned that the Hubble telescope was able to solve an age-old “whodunit” mystery related to dwarf galaxies. I was intrigued. That seemed like the right direction. Nevertheless, I was unable to make any progress with that.
I decided to check the EXIF data of the image. Haunted by the memories of my previous experience reversing an ExifTool RCE, I thought I’ll just check if the EXIF data has been tampered with:
exiftool image.jpg
The output was interesting! I found the following in the metadata:
GPS Altitude : 0 m Above Sea Level
GPS Date/Time : 1915:11:21 19:00:00Z
GPS Latitude : 68 deg 38' 30.00" S
GPS Longitude : 52 deg 58' 0.00" W
GPS Position : 68 deg 38' 30.00" S, 52 deg 58' 0.00" W
That seemed odd. I’d never seen the GPS Altitude
field specified. GPS Date/Time
field showed 21st November 1915. The GPS coordinates were provided in Degrees, Minutes, and Seconds
format. Using an online converter, I converted 68 deg 38' 30.00" S 52 deg 58' 0.00" W
to latitude and longitude:
-40.76000000,-73.98400000
I checked the location in Google Maps: it was in the middle of nowhere in the Chilean sea.
I backtracked a bit and checked https://en.wikipedia.org/wiki/November_1915 to see the important events that happened in the year 1915. november 21 1915 chile
also returned the same Wikipedia article.
Under November 21, 1915 (Sunday)
, I noticed the following:
The British polar exploration ship Endurance finally broke apart from the pressure of the ice pack around it and sank into the Weddell Sea, stranding the Imperial Trans-Antarctic Expedition party in the Antarctic.[99][100] The remains of Endurance, 10,000 feet (3,000 m) beneath the surface of the Weddell Sea, would not be rediscovered for more than 106 years, finally spotted in March 2022. [101]
That seemed interesting and appeared to be fairly connected to what I had. I opened the Endurance article and Ctrl F’d for 21 November
: I found the following passage:
In the late afternoon of 21 November,[68] movement of the remaining wreckage was noticed as another pressure wave hit. Within the space of a minute, the stern of the Endurance was lifted clear of the ice as the floes moved together and then, as the pressure passed and they moved apart, the entire wreck fell into the ocean. The ice surrounding the spot where the Endurance had sunk immediately moved together again, obliterating any trace of the wreck. Worsley fixed the position as 68° 38.5’S 52° 58’W.[69]
FrankWorsley
was the solution. From the Wikipedia article, I also learned that the wreckage of Endurance was found in the Weddell Sea, 3.5 nautical miles (6.4 km) south of Worsley’s original calculated location, on March 22, 2022.
Level 9
Channel Topic:
Welcome to Level 09 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/nFtCnpOvF9rehx8fbHIGglf12c82wk5n.png | https://is.gd/rUqJ4K || Hint(s): https://is.gd/GwpqIz | How about some more https://is.gd/2EAb41
The clue image was confusing. I had no idea what it meant.
The second image was the picture of a cat in the White House:
The hint was the following image:
I tried scanning parts of the first image with Google Lens (which allows you to do reverse image searches), hoping to find flags of various countries. But that effort was in vain.
Then I opened up the image in GIMP, rearranged the different sections, did bucket fill with various colours, experimented with the opacity, etc., but nothing helped. I also checked for hidden data via steganography and inspected the EXIF metadata; however, I could not find anything.
I thought the takeaways from the cat picture could be “The United States”, “White House”, or just “cat”. The hint picture suggested a “bar” or “bar layout”. I tried arranging the different sections in the first image in a “bar layout”, but that didn’t help.
The flags in the Confederate States of America were called “stars and bars”, so I checked those flags to see if they’d match the ones in the first image; unfortunately, they did not. I also unsuccessfully explored other elaborations of BAR, such as Body of Lawyers.
Then it struck me: it was a bar code! But not a regular bar code. I checked Wikipedia for Bar code
, and found that the first image is a Kartrak code.
In the Kartrak code, each bar has a special meaning. The decoded bar code looked like this:
Reading the Wikipedia article, I found:
The labels are to be read from bottom to top:
- Line 13: check digit.
- Line 12: stop label.
- Lines 6 to 11: car number.
- Lines 2 to 5: equipment owner code.
- Line 1: start label.
Reading the first image bottom-to-top, I got:
start
0 -> privately owned
2
4
0
9 -> type of unit
0 -> suffix number
1
X -> unsure what this is
3
1
stop
2 -> check digit
The 9th line was an empty bar; I did not know what that meant. Reading the Wikipedia article further, I found the following:
The first digit of the equipment owner (line 2) marks the type of equipment: 0 for railroad-owned, 1 for privately-owned, or 6 for non-revenue equipment.
The car number is left-padded with zeroes if necessary. For locomotives, line 6 is the type of unit and line 7 is the suffix number.
The check digit is calculated as follows: Each number digit is multiplied by two to the power of the labels’ position minus two. Thus, the first digit (line 2) is multiplied by 1, the second by 2, the third by 4, the fourth by 8 and so on, until the 10th, which is multiplied by 512. The sum of all these numbers modulo 11 is the check digit.[1]
I quickly realized the missing digit is not a space. It’s indeed a missing digit that we needed!
Assuming the missing digit was X, the sum of the digits as mentioned would be:
0*1 + 2*2 + 4*4 + 0*8 + 9*16 + 0*32 + 1*64 + x*128 + 3*256 + 1*512
I knew that the check digit was 2. Therefore,
(0*1 + 2*2 + 4*4 + 0*8 + 9*16 + 0*32 + 1*64 + x*128 + 3*256 + 1*512) % 11 = 2
Solving for X, I got 8 (the missing digit).
The last hint was suggesting a “date”. I wrote down the digits in order:
0240901831
This was indeed a date in disguise:
24 09 1831
Googling September 24th, 1831 wikipedia
gave me https://en.wikipedia.org/wiki/Portal:Trains/Anniversaries/September_24. The article contained the following:
“1831 – The Mohawk and Hudson Railroad opens between Albany and Schenectady, New York.”
After trying a few potential candidates from https://en.wikipedia.org/wiki/Albany_and_Schenectady_Railroad as the answer, I noticed the following paragraph:
The DeWitt Clinton locomotive, built by the West Point Foundry in New York, made its first test run on July 2, 1831. After some hesitation, it was decided that the engine would burn wood rather than coal. The official opening took place on September 24, 1831, with approximately eighty politicians and dignitaries.
The answer was DeWittClinton
. What a fun level!
Level 10
Channel topic:
Welcome to Level 10 of #ircpuzzles || Clue(s): https://is.gd/Tohirt || Hint(s): https://is.gd/TdwGCe | coordinates | location, rotation, stringification | one codepoint per piece | ♘ < ♗ | ♙ < ♟ | hïñt
The clue image had a chessboard with multiple pieces:
Despite my love for chess, staring at the board for a while did not give me any ideas on how to solve this level. However, some of the pieces were oriented in two directions. Additionally, the kings were in adjacent squares, and the black pawn was on the first rank. This wasn’t a valid chess position.
Since the clue mentioned “coordinates”, I started thinking about coordinate chess notation. I didn’t get anywhere with that. Then I noticed there’s only A-F on the board instead of the usual A-H. I thought it was a subtle hint at “hexadecimal”; that led me to 0x88 board representation: https://en.wikipedia.org/wiki/0x88. Still, I couldn’t make much out of this.
The clue about one codepoint per piece seemed to suggest something about UTF8 codepoints, but without decoding the board itself, I felt that hint was useless.
I set up the pieces in a board editor and created the FEN notation (it is the standard notation to describe positions of a chess game) disregarding the fact that pieces were rotated. However, after staring at an incorrect position, I felt lost. This was absurd!
I found the coordinates of the pieces:
E8 F8 B7 D6 E6 D4 E4 F4 B3 E2 F2 D1
I converted them to hex and then Unicode, but got alien-speak — èø·ÖæÔäôô³
. Then, I remembered that I hadn’t used the first hint, a picture of Battleship:
Since the general theme of this year was history, I thought maybe it was hinting at a historic battle between two kings? I felt like I was grasping at straws.
Hint ♘ < ♗
could mean that knights are less valuable than bishops. I found https://en.wikipedia.org/wiki/Chess_piece_relative_value#Hans_Berliner's_system to support this idea. The next hint was ♙ < ♟
, which could’ve similarly meant that black pawns were less valuable than white pawns. However, that isn’t true in normal chess: both pieces are equally valued. My hypothesis seemed to be incorrect.
I also explored another tangent: Bobby Fischer is a player who was usually able to exploit the strengths of the bishop against the knight. He’s also had a good history of winning with black pieces, but since that did not link well with other clues, I ruled that path out.
Then I labelled the pieces with their coordinates to see if that would help:
Following my logic above, I interpreted ♘ < ♗
to mean that black knights came before white bishops (before-rotation coordinates first). Same with ♙ < ♟
— black pawns before white pawns, working upwards from A1.
I got something like:
D1 F2 B3 B7 F8 E8 6D 4D 6E 4E 2E 4F
After reaching nowhere with that idea, I started to think about Unicode. I discovered there are Unicode characters for rotated chess pieces as well. I checked the values in multiple encodings such as UTF-8m UTF-16BEm UTF-32BE, UTF-32LE, HTML code, CSS code, etc., but in all of them, the value of Bishop was lower than Knight.
I searched a lot; yet, I could not find an ordering system involving chess pieces. The closest match I found was that knighthood is given by church folks like the Pope (Bishop is another similar one). That seemed like a stretch. The Periodic table had B < N, too.
After a while of head-scratching, I realized maybe I did not have to find an ordering system, but order pieces in that order.
I found the corresponding Unicode codepoints for the all the relevant chess symbols from a Unicode chart online:
1FA09 🨉 WHITE CHESS KING ROTATED NINETY
1FA0A 🨊 WHITE CHESS QUEEN ROTATED NINETY
1FA0B 🨋 WHITE CHESS ROOK ROTATED NINETY
1FA0C 🨌 WHITE CHESS BISHOP ROTATED NINETY
1FA0D 🨍 WHITE CHESS KNIGHT ROTATED NINETY
1FA0E 🨎 WHITE CHESS PAWN ROTATED NINETY
1FA0F 🨏 BLACK CHESS KING ROTATED NINETY
1FA10 🨐 BLACK CHESS QUEEN ROTATED NINETY
1FA11 🨑 BLACK CHESS ROOK ROTATED NINETY
1FA12 🨒 BLACK CHESS BISHOP ROTATED NINETY
1FA13 🨓 BLACK CHESS KNIGHT ROTATED NINETY
1FA14 🨔 BLACK CHESS PAWN ROTATED NINETY
2654 ♔ WHITE CHESS KING
2655 ♕ WHITE CHESS QUEEN
2656 ♖ WHITE CHESS ROOK
2657 ♗ WHITE CHESS BISHOP
2658 ♘ WHITE CHESS KNIGHT
2659 ♙ WHITE CHESS PAWN
265A ♚ BLACK CHESS KING
265B ♛ BLACK CHESS QUEEN
265C ♜ BLACK CHESS ROOK
265D ♝ BLACK CHESS BISHOP
265E ♞ BLACK CHESS KNIGHT
265F ♟ BLACK CHESS PAWN
These were the pieces from the board (along with their coordinates that I found earlier):
E8 - 2657 ♗ WHITE CHESS BISHOP
F8 - 265C ♜ BLACK CHESS ROOK
B7 - 265E ♞ BLACK CHESS KNIGHT
B3 - 2659 ♙ WHITE CHESS PAWN -
F2 - 265B ♛ BLACK CHESS QUEEN
D1 - 265F ♟ BLACK CHESS PAWN
4F - 1FA09 🨉 WHITE CHESS KING ROTATED NINETY
6E - 1FA0B 🨋 WHITE CHESS ROOK ROTATED NINETY
4E - 1FA0F 🨏 BLACK CHESS KING ROTATED NINETY
2E - 1FA0A 🨊 WHITE CHESS QUEEN ROTATED NINETY
6D - 1FA12 🨒 BLACK CHESS BISHOP ROTATED NINETY
4D - 1FA0D 🨍 WHITE CHESS KNIGHT ROTATED NINETY
Looking at this, I realized maybe I did not need to think about the colour of the bishops. Maybe the clue meant any knight is less valuable than any bishop, and white before black, just to hint at the order.
I listed them in the following order: Pawn, Knight, Bishop, Rook, Queen, King. White pieces were listed first and knights were listed before bishops. I got:
B3 - 2659 ♙ WHITE CHESS PAWN
4D - 1FA0D 🨍 WHITE CHESS KNIGHT ROTATED NINETY
E8 - 2657 ♗ WHITE CHESS BISHOP
6E - 1FA0B 🨋 WHITE CHESS ROOK ROTATED NINETY
2E - 1FA0A 🨊 WHITE CHESS QUEEN ROTATED NINETY
4F - 1FA09 🨉 WHITE CHESS KING ROTATED NINETY
D1 - 265F ♟ BLACK CHESS PAWN
B7 - 265E ♞ BLACK CHESS KNIGHT
6D - 1FA12 🨒 BLACK CHESS BISHOP ROTATED NINETY
F8 - 265C ♜ BLACK CHESS ROOK
F2 - 265B ♛ BLACK CHESS QUEEN
4E - 1FA0F 🨏 BLACK CHESS KING ROTATED NINETY
Then I converted them to hex and then Unicode:
>>> print(u"\xB3\x4D\xE8\x6E\x2E\x4F\xD1\xB7\x6D\xF8\xF2\x4E")
³Mèn.OÑ·møòN
“3 men on moon”. Finally, a readable output!
Shortly after, I found Apollo 11, the American spaceflight that first landed humans on the Moon. apollo11
was the answer! That was an intriguing puzzle.
Level 11
Channel topic:
Welcome to Level 11 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/d9bDX41cAqn5U2rCZktUU53QNmG1SInj.png | 名
There weren’t any hints and that was relieving — I hoped that meant this level wasn’t as difficult as the previous one.
This looked like a Nonogram puzzle (https://en.wikipedia.org/wiki/Nonogram). 名
is Japanese for “name”. Maybe I needed to find the name of whatever the first image turned out to be.
I solved the Nonogram using an online tool:
It resembled a QR code in some ways, but I was unable to scan it. After pondering a while, I remembered there were different types of Bar codes (from level 9’s Wikipedia reading).
I found Aztec code to be somewhat similar to the image output I had, but that was not accepted as the answer. After scrolling down the Wikipedia page, I found Han Xin code, which was a strong match with my output!
Indeed, the answer was hanxin
.
Level 12
Channel topic:
Welcome to Level 12 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/eiPBAVJWc80CbPqz4lm1AcH8fjVGKzSV.jpg || Hint(s): https://is.gd/LktBOj
This was the clue image:
The first thing I noticed was something opaque within the swan image. It looked like a fighter jet. To make the number on the jet clearer, I opened the image in GIMP and played with the colour settings, brightness, etc. It looked like 5082, 5092, or 6062. After googling the numbers, I reached https://en.wikipedia.org/wiki/Tupolev_Tu-160, but that did not look like the jet in the picture.
From reverse-image searching, I found the original swan image. I opened the original and the modified images in GIMP, and used layer subtraction to see the difference in two images. That gave a much clearer result:
Searching 6062 (from the plane rubber) gave me https://en.wikipedia.org/wiki/Bell_X-1, and the image on Wikipedia was an exact match!
Now I needed to find some connection between Bell-X1 and the swan. I found that there’s a replica of Bell X1 at a restaurant in Los Angeles with Bird in its name, but that was not very useful.
From a reverse image search, I noticed the swan was a Mute Swan, a different swan species. I tried many searches with mute + bell x1
, mute supersonic
, mute + mach3
(since Bell X1 was the first to cross Mach 3 speed), etc.
Then I learned that swans are of the genus “Cygnus”. I tried a couple more searches such as cygnus bell x1
and cygnus x1
. The latter yielded https://en.wikipedia.org/wiki/Cygnus_X-1.
CygnusX1
was the answer!
Cygnus X-1 is a galactic X-ray source in the constellation Cygnus and was the first such source widely accepted to be a black hole.
Later, I found out that the EXIF data for the swan image contained a UUID (0d0f04a0-c0b8-447b-8a37-b1536da5b8f1
) that was
Level 13
Channel topic:
Welcome to Level 13 of #ircpuzzles || Clue(s): https://wordgame.ircpuzzles.org/2JZiF4j1yvM1RPFciP9a/ | le chiffrage indéchiffrable
I opened the URL and saw the following:
A word game? I liked playing Wordle, so I was excited!
The gameplay appeared to be similar to Wordle, but I had to guess 2 words at once, and instead of 5 letter words, there were 9 letter words:
Furthermore, the words changed every game.
After a couple of attempts, I was able to guess a word on the left with regular Wordle gameplay. But no matter how many times I played, I was not able to guess the word on the right.
The clue string had le chiffrage indéchiffrable
— this is a French phrase meaning “the indecipherable cipher”. The Vigenère cipher was thought to be unbreakable until late in the 19th century. It seemed like the clue string was hinting at the Vigenère cipher.
I started thinking about how to apply the Vigenère cipher in this context.
I knew that:
vigenere_encode(plaintext, secret_key) = ciphertext
Assuming they used a unique secret_key
on the backend to generate the word on the right:
vigenere_encode(first_word, secret_key) = second_word
vigenere_decode(second_word, secret_key) = first_word
But I did not know the secret_key
they used. However, in a Vigenère cipher, the ciphertext is calculated by adding the n-th letter of the plaintext and the key, modulo 26 (for the English alphabet). In mathematical terms, it can be represented as below:
Cn = Pn + Kn mod 26
To decrypt the message, the key is subtracted from the plaintext:
Pn = Cn - Kn mod 26
Conversely, if we know Pn and Cn, we can solve for Kn, and get the following:
Kn = Cn - Pn mod 26
This translates to:
vigenere_decode(first_word, second_word) = secret_key
This meant I needed the first word and the second word to obtain the secret key. I was able to find the first word in a few attempts, but the second word appeared to be a random sequence of characters instead of a word, so guessing it wasn’t as straightforward.
Then, I automated the process. First, I built a wordlist of 9-letter words. Later, I wrote a script to solve the 9-wordle: given the current state of the game, the script would find the next optimal guess. This was to help me solve the current first word. Afterwards, the script would find the optimal guesses for finding the second word.
At last, I got a solution:
My first word was DECLINING
and my second word was RQZHRAAUI
. Do note that when I originally solved the challenge, the process of guessing the second word took more steps than depicted above.
I had a pair of words. To find the secret key, all I needed to do was to do vigenere_decode(first_word, second_word)
:
>>> vigenere_decode('DECLINING', 'RQZHRAAUI')
'MODERNITY'
That was correct!
Level 14
Channel topic:
Welcome to Level 14 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/hFmUA6TcbtWug83yQ8fLOUKzAw8Nmb2M.txt || Hint(s): 😐😶😮😶😮😐😶😮😮 | https://is.gd/Eoh0WH
I opened the clue URL and found the following:
😮😐😐😶😮😐😐😶😮😮😐😶😮😶😮😮😮😶😮😮😶
😶😶😮😐😮😶😐😐😐😐😶😮😮😐😶😮😮😐😶😮😮
😐😶😮😐😮😶😮😮😮😶😮😐😶😮😮😐😶😮😐😐😶
😶😶😮😮😐😶😮😮😐😶😮😮😮😶😮😐😶😮😮😐😶
😮😐😐😮😶😮😮😐😮😶😮😮😮😮😶😮😮😮😶😮😐
😐😶😶😶😮😮😐😶😮😐😮😮😶😮😮😐😶😮😐😮😶
😮😮😐😶😮😐😐😮😶😮😮😐😶😮😮😮😐😶😮😮😐
😶😮😐😮😶😮😮😐😶😮😮😮😐😶😶😶😮😐😐😶😮
😮😮😶😮😮😮😶😮😐😮😶😮😮😮😶😮😐😶😮😮😐
😶😮😐😮😮😶😮😮😐😶😮😐😮😶😮😮😐😶😮😮😮
😐😶😮😮😮😶😮😮😶😮😮😐😶😮😶😮😮😐😶😮😮
😐😐😶😮😮😐😶😮😶😮😮😮😶😮😐😐😶😮😐😶😮
It was a bunch of faces! It did not make any sense to me. The hint was another set of emojis, which did not help either.
I tried searching for the hint string (😐😶😮😶😮😐😶😮😮
) in the clue string, but the full hint string was not a substring of the clue string. Then, I tried replacing each emoji with another character to see if a pattern would emerge — it didn’t.
I noticed the emojis had dots and dashes — that made me think of Morse code. I tried to decode it as Morse, but that gave me gibberish. My next thought was Braille. Unfortunately, that idea did not pan out either.
Next, I attempted to fold the clue string into different widths. I obtained the list of divisors for 252 (the total number of emojis) to find all the possible ways I could evenly wrap the text. For instance, this is an 18x14 grid:
😮😐😐😶😮😐😐😶😮😮😐😶😮😶😮😮😮😶
😮😮😶😶😶😮😐😮😶😐😐😐😐😶😮😮😐😶
😮😮😐😶😮😮😐😶😮😐😮😶😮😮😮😶😮😐
😶😮😮😐😶😮😐😐😶😶😶😮😮😐😶😮😮😐
😶😮😮😮😶😮😐😶😮😮😐😶😮😐😐😮😶😮
😮😐😮😶😮😮😮😮😶😮😮😮😶😮😐😐😶😶
😶😮😮😐😶😮😐😮😮😶😮😮😐😶😮😐😮😶
😮😮😐😶😮😐😐😮😶😮😮😐😶😮😮😮😐😶
😮😮😐😶😮😐😮😶😮😮😐😶😮😮😮😐😶😶
😶😮😐😐😶😮😮😮😶😮😮😮😶😮😐😮😶😮
😮😮😶😮😐😶😮😮😐😶😮😐😮😮😶😮😮😐
😶😮😐😮😶😮😮😐😶😮😮😮😐😶😮😮😮😶
😮😮😶😮😮😐😶😮😶😮😮😐😶😮😮😐😐😶
😮😮😐😶😮😶😮😮😮😶😮😐😐😶😮😐😶😮
However, I did not notice any patterns in any of these layouts.
Then I took a screenshot of the emojis and opened it in GIMP to see if I could construct connections between similar emojis. However, I found nothing.
I decided to do some frequency analysis on the clue/hint strings. I found the bigrams:
Bigrams - Clue
{
('😶', '😮'): 60,
('😮', '😮'): 53,
('😮', '😐'): 45,
('😐', '😶'): 35,
('😮', '😶'): 26,
('😐', '😐'): 12,
('😐', '😮'): 11,
('😶', '😶'): 8,
('😶', '😐'): 1
}
Bigrams - Hint
{
('😶', '😮'): 3,
('😐', '😶'): 2,
('😮', '😶'): 1,
('😮', '😐'): 1,
('😮', '😮'): 1
}
Trigrams - Clue
{
('😶', '😮', '😮'): 37,
('😐', '😶', '😮'): 32,
('😮', '😐', '😶'): 27,
('😮', '😮', '😐'): 25,
('😮', '😶', '😮'): 24,
('😶', '😮', '😐'): 19,
('😮', '😮', '😮'): 14,
('😮', '😮', '😶'): 14,
('😮', '😐', '😐'): 9,
('😮', '😐', '😮'): 9,
('😐', '😮', '😶'): 9,
('😐', '😐', '😶'): 8,
('😶', '😶', '😶'): 4,
('😶', '😶', '😮'): 4,
('😶', '😮', '😶'): 3,
('😐', '😶', '😶'): 3,
('😐', '😐', '😐'): 2,
('😐', '😐', '😮'): 2,
('😐', '😮', '😮'): 2,
('😮', '😶', '😶'): 1,
('😮', '😶', '😐'): 1,
('😶', '😐', '😐'): 1
}
Trigrams - Hint
{
('😐', '😶', '😮'): 2,
('😶', '😮', '😶'): 1,
('😮', '😶', '😮'): 1,
('😶', '😮', '😐'): 1,
('😮', '😐', '😶'): 1,
('😶', '😮', '😮'): 1
}
Some observations I made:
(😮, 😐)
repeated more than others in the clue string, but that didn’t suggest much.- There were many repeating trigrams in the clue string with high-frequency counts. It could have meant it was some sort of monoalphabetic substitution cipher.
- All the trigrams in the hint also appeared in the clue string.
After some research, I found an esoteric language called unicat, that’s made of cat emojis. I tried converting these emojis to their cat emoji equivalents and tried to evaluate it as a unicat — however, that wasn’t useful.
It started to feel like these faces were laughing at my futile attempts to decode them.
I decided to concentrate more on the hint. There were 9 emojis, and they served a purpose. I needed to find out what they meant.
While zooming in on the GIMP image I was playing around with earlier, I noticed each emoji had a horizontal line in it (the mouth) and 2-3 black circles (eyes, mouth). It was a stretch, but the 1s and 0s resembled binary.
I tried replacing the hint string in the following manner: 😐 => 1; 😶 => space; 😮 => 0… and received the output: 1 0 01 00
. That did not seem particularly helpful.
I tried another variation: 😮 => 1; 😶 => space; 😐 => 0
. To my surprise, that gave me 0 1 10 11
as the output. I had found the right way to decode the emojis — they’re counting from 0 to 3 in binary!
I did the same operation on the clue string and got the following output:
100 100 110 1 111 11
101 0000 110 110 11
0 101 111 10 110 100
110 110 111 10 110
1001 1101 1111 111 10
0 110 1011 110 101
110 1001 110 1110 110
101 110 1110 100 1
11 111 101 111 10 110
1011 110 101 110 111
0 111 11 110 1 110 11
00 110 1 111 100 10 1
I noticed there were as many as 3 consecutive spaces in the output. I wasn’t sure if that was relevant. I converted the binary values to their decimal equivalents:
4 4 6 1 7 3
5 0 6 6 3
0 5 7 2 6 4
6 6 7 2 6
9 13 15 7 2
0 6 11 6 5
6 9 6 14 6
5 6 14 4 1
3 7 5 7 2 6
11 6 5 6 7
0 7 3 6 1 6 3
0 6 1 7 4 2 1
Without the newlines and spaces, I had 446173 5066657264 667269df74 6b65696e656e 4775726b656e73616c617421
. The numbers did not make much sense. I couldn’t notice a pattern here. After a while, I fruitlessly tried to decode them as A1Z26 cipher (A=1, B=2, …, Z=26). My next attempt was to decode them as hex (A=1, F=15). I got the following:
4461735066657264667269df746b65696e656e4775726b656e73616c617421
After trying out a few different ways to decode it, I figured it out — I had to decode them as ASCII:
for a in re.findall(r'..', '4461735066657264667269df746b65696e656e4775726b656e73616c617421'):
print(chr(int(a, 16)), end='')
I received the following output:
DasPferdfrißtkeinenGurkensalat!
Finally, a readable output! I was relieved. I googled the string and arrived at https://en.wikipedia.org/wiki/Reis_telephone.
The Reis telephone was an invention by Johann Philipp Reis, a German scientist. It is considered by many today as the first telephone, which predates Alexander Graham Bell’s telephone. The actual credit for the telephone’s invention is a subject of great dispute to this day.
reistelephone
was accepted! That took forever — the phone line with the answer must’ve been slow!
Level 15
Channel Topic:
Welcome to Level 15 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/TLvVv8x0ri89MTyeJch8sDrb32eBZ2zH.data
Another file! I quickly downloaded the file and ran file -k
:
$ file -k TLvVv8x0ri89MTyeJch8sDrb32eBZ2zH.data
TLvVv8x0ri89MTyeJch8sDrb32eBZ2zH.data: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 262144)\012- data
It was a network capture file! As part of my routine, I ran strings
just to be sure — but there was no output. I opened the PCAP file in Wireshark:
There was only a single TCP packet. The TCP payload was not readable either, and nothing else stood out to me.
Maybe I needed to do some data mangling to make it readable. I wrote the following snippet to open the packet capture file using the scapy library:
from scapy.all import *
packets = rdpcap('TLvVv8x0ri89MTyeJch8sDrb32eBZ2zH.data')
print(packets[0][Raw].load)
The output looked like this:
b'\xf0\x9f\x8f\x81'
I then decoded the binary data:
print(packets[0][Raw].load.decode())
🏁
A flag! That was unexpected. It was ironic that I hadn’t completed the level despite having the flag.
I read up on the history of the checkered flag, but that did not lead anywhere. I was missing something. I inspected the packet again.
While checking the attributes, I noticed the sequence number:
That looked like a date! 19830101
was January 1st, 1983
.
I googled January 1st, 1983 + flag
and found https://en.wikipedia.org/wiki/Flag_day_(computing).
On January 1, 1983, also known as flag day, NCP on the ARPANET was replaced by the TCP/IP protocols, marking the start of the modern Internet.
flagday
was the answer!
Level 16
Channel topic:
Welcome to Level 16 of #ircpuzzles || Clue(s): https://files.ircpuzzles.org/2022/uPZiWPIJrnvCLpCKZhze2BQjD5zeCnxt.png | Hint(s): protons
The clue image was:
Chemistry was not my favourite subject back in school. But I knew this resembled molecules. There were atoms… that’s all I could understand. I started reverse searching the molecular structures one by one on Google, but except for the last one, I could not find any hits.
I discovered there were websites like PubChem that allowed me to search for molecules by drawing their structure using a web interface. I spent some time scribbling using the online tool, but I was unsuccessful. That made me believe that some of the structures may not have been valid.
I was completely clueless about how to proceed with this level — I felt like I was stuck in school again. We used to write the given problem information in Chemistry class, so I decided to list all the information I could gather.
I found that atoms are assigned colours in molecular models:
Carbon did not use Black, but the rest were as per the table on Wikipedia:
- Carbon = Gray
- Chlorine = Green
- Hydrogen = White
- Nitrogen = Blue
- Oxygen = Red
- Phosphorous = Orange
- Sulphur = Yellow
Based on this colour coding, I started writing down what the molecular compounds would be named. They did not have to be correct. At this point, I was just writing down the information I had. It looked something like:
Then I remembered that I hadn’t thought much about the hint — “protons”. I knew Hydrogen is also called proton. And Hydrogen appeared to be present in all the molecules shown. It felt to me as if I should focus on Hydrogen. As per this year’s theme, I started looking into Hydrogen’s history, but that was in vain.
I tried counting the number of hydrogen atoms on each molecule, like so:
5H 4H 7H 4H 6H 3H 8H 8H 2H
And then I futilely tried to interpret the above as hours, dates, hex, ASCII, etc. I created a 3x3 grid (since there were 9 molecules) containing the chemical symbols and atomic numbers of each atom, but that did not pan out either.
Proton also meant “first” in Greek, and I tried taking the first letters of all the elements and solving them as an anagram; however, that was not very helpful. I was missing something crucial.
The protons hint could also mean “atomic number” (since the atomic number is the number of protons in an atom). I decided to write down the atomic numbers of all the elements in each of the molecules. I also summed all the atomic numbers in each molecule.
I got something like the above. The atomic sums were:
[95, 42, 28, 33, 39, 7, 90, 99, 53, 16]
I tried converting them to 1-26 alphabet mapping, and I got:
rqchnhmvbq
That seemed like it could’ve been ROT-N encoded, so I tried decoding it as ROT-N. That didn’t help.
Then I noticed all the numbers were less than 112, which is the highest atomic number.
I took the element corresponding to each atomic number in the list above, and got the following:
americium molybdenum nickel arsenic yttrium nitrogen thorium einsteinium iodine sulfur
The first letters of each of these elements yielded:
amnaynteis
That meant nothing.
Then I had another idea to interpret the numbers as years:
- 1995
- 1942
- …
- 1916
I started looking up who won the Nobel for chemistry in these years, but quickly noticed there was no Nobel awarded for Chemistry in 1916, so this was the wrong path.
After pondering a while, I realized I may have missed something. When I took the first letters of the elements, I could have instead taken the chemical symbols ( Americanum = Am, Molybdenum = Mo, Nitrogen = N, and so on). I did that:
pt = requests.get('https://raw.githubusercontent.com/Bowserinator/Periodic-Table-JSON/master/periodic-table-lookup.json').json()
print(''.join([pt[elements[x-1]]['symbol'] for x in atomic_sums]))
The output was:
AmMoNiAsYNThEsIS
That worked! What a satisfying challenge — maybe Chemistry class was useful after all.
Level 17
Channel topic:
Welcome to Level 17 of #ircpuzzles || Clue(s): https://plumage.oriole.systems/8y0fyA4vdp.png
It was another nonogram! I solved it using an online nonogram solver and got the following output:
It read: YOU WON CHAAYC
. What in the history was CHAAYC?!
I was bored and did not have any ideas, so I took the orphaned pieces and tried to construct a word (similar to how jigsaw pieces are assembled):
I also cut out pieces of paper in the shapes of these letters to see if I could make a word that made sense. However as there were so many possible ways to do it, that couldn’t have been the way to do it.
After a while, I decided to recheck my nonogram. I found I had some numbers incorrect. I redid it and got the following output:
This time it read:
YOU WON CHMMYR
I wasn’t sure about the R. I thought about it for a long time but did not have any new ideas. I thought maybe the word CHMMYR is encoded in a certain fashion. I tried ROT-13 first. To my surprise, the output was readable!
PUZZLE
It read YOU WON PUZZLE
.
I quickly typed /join #ircpuzzles-2022-afpc-18 puzzle
. I was in!
The channel topic read:
Welcome to the winner’s circle!
I had won! My IRCPuzzles journey was over. Kudos to the IRCPuzzles team for organizing the whole event, and coming up with thoughtful puzzles.
I would like to thank @KarimPwnz for proofreading the blog post and offering helpful suggestions prior to publication.