zacheller@home:~/blog$

eps1.91_redwheelbarr0w.txt - Full Writeup


Here are my writeups for every challenge I identified in the MR ROBOT book eps1.91_redwheelbarr0w.txt.


Mysterious Envelope

The journal mentions that the envelope arrives with no message inside it. On the outside there is standard postmarking plus a message from Hot Carla.

outside

Checking the inside, the text BANK OF E SAVINGS AND LOAN is repeated ad infinitum. Except, in one section there are a lot of spelling errors and missing spaces at seemingly random parts of the phrase.

inside

Curious… I started writing out which characters were missing in each line. After finding 3 spaces is a row, I was pretty sure I was on the wrong path. I continued a little while longer just to check: AND_CD___INAENDB. I then had the idea to count the number of characters in the phrase.

$ echo -n "BANK OF E SAVINGS AND LOAN" | wc -c
26

What else has 26 characters? The English alphabet. For each wonky string, I wrote down the index of the missing character (0-25). For example: the string ANK OF E SAVINGS AND LOAN becomes 0, and the string BANKOF E SAVINGS AND LOAN becomes 4. I then translated that into the corresponding letter at that position in the alphabet using Python.

>>> positions = [24, 14, 20, 17, 2, 20, 17, 17, 4, 13, 19, 18, 8, 19, 20, 0, 19, 8, 14, 13, 2, 0, 13, 13, 14, 19, 0, 5, 5, 4, 2, 19, 18, 19, 0, 6, 4, 19, 22, 14, 19, 14, 2, 14, 12, 12, 20, 13, 8, 2, 0, 19, 4, 20, 18, 4, 3, 4, 0, 3, 3, 17, 14, 15, 8, 13, 11, 8, 1, 17, 0, 17, 24, 4, 13, 2, 24, 2, 11, 14, 15, 4, 3, 8, 0, 21, 14, 11, 19, 22, 14, 13, 4, 23, 19, 12, 4, 18, 18, 0, 6, 4, 8, 13, 22, 14, 17, 3, 18, 4, 0, 17, 2, 7]
>>> result = ''
>>> for num in positions:
...     result += chr(num + 97) # 0->a, 1->b, etc
...
>>> print result
yourcurrentsituationcannotaffectstagetwotocommunicateusedeaddropinlibraryencyclopediavoltwonextmessageinwordsearch

The cleaned up final message reads:

Your current situation cannot affect Stage Two. To communicate, use dead drop in library Encyclopedia, Vol. 2. Next message in word search.


QR Code

I scanned the QR Code with my phone and it directed me to conficturaindustries.com.

qr

The website is designed to look like an old Geocities site. I believe it’s a part of the greater MR. ROBOT ARG, and not so much a self-contained puzzle related to the rest of the journal. The previous challenge explicitly said the next message would be in the word search. But it still looked interesting, so I gave it a shot.

I clicked around the page, read the source code (Ctrl-U), and checked the developer console (F12). The site has a few key elements.

  • A Latin reference: Confictura is Latin for imagination.
  • A Confucius quote: “Our greatest glory is not in never falling, but in rising every time we fall.”
  • Broken image links:
      <img src="img/image_confictura01.jpg" alt="image_confictura01">
      <img alt="image_bcyufvmducwkydszpwn" src="img/image_bcyufvmducwkydszpwn.jpg">
      <img src="img/image_productmenu.jpg" alt="image_productmenu">
    
    • Note: We cannot access /images or /img on the server.
  • A counter:
      <!-- COUNTER -->
      <span id="a">
          <img src="images/0.gif">
          <img src="images/0.gif">
          <img src="images/0.gif">
          <img src="images/0.gif">
          <img src="images/3.gif">
          <img src="images/4.gif">
          <img src="images/2.gif">
      </span>
      <!-- COUNTER -->
    
  • A minified JS file named c.js, which I unminify here:
      "use strict";
      $(function () {
          function t(t) {
              (a = !1),
                  $.ajax({
                      url: "check.php",
                      type: "POST",
                      data: { a: t, b: "" },
                      success: function (e) {
                          e.response &&
                              (function (t, e) {
                                  "string" == typeof e && e.indexOf("r") > 0
                                      ? window.location.reload(!0)
                                      : ($("#a").replaceWith(
                                            '<form id="f" method="POST"><input type="text" class="i" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></input><input type="submit" style="position: absolute; left: -9999px"/></form>'
                                        ),
                                        $(".i").focus(),
                                        (function (t) {
                                            $("#f").submit(function (e) {
                                                e.preventDefault();
                                                var a = $(".i").val();
                                                !(function (t, e) {
                                                    $.ajax({
                                                        url: "check.php",
                                                        type: "POST",
                                                        data: { a: t, b: e },
                                                        success: function (t) {
                                                            window.location.reload(!0);
                                                        },
                                                        error: function (t) {},
                                                    });
                                                })(t, a);
                                            });
                                        })(t));
                              })(t, e.response),
                              (a = !0);
                      },
                      error: function (t) {
                          a = !0;
                      },
                  });
          }
          var e = null,
              a = !1;
          $.ajax({
              url: "c.php",
              cache: !1,
              type: "GET",
              dataType: "html",
              success: function (t) {
                  var e = t;
                  $("#a").html(e), (a = !0);
              },
          }),
              $("#a")
              .on("touchstart click", "> *", function (n) {
                  if ((n.stopPropagation(), n.preventDefault(), a && !n.handled)) {
                      var o = parseInt($(this).attr("src")[7]),
                          c = "",
                          i = "images/" + (o = o < 9 ? o + 1 : 0) + ".gif";
                      $(this).attr("src", i),
                          e && clearTimeout(e),
                          (e = setTimeout(function () {
                              for (var e = 0; e < 7; e++) {
                                  var a = $("#a").children()[e];
                                  c += $(a).attr("src")[7];
                              }
                              t(parseInt(c));
                          }, 500)),
                          (n.handled = !0);
                  }
              })
              .on("dblclick", function (t) {
                  t.preventDefault();
              });
      });
    

When reading through c.js, I noticed that the element with id="a", our counter, was important. There is PHP (c.php) which grabs the html of the counter.

$.ajax({
    url: "c.php",
    cache: !1,
    type: "GET",
    dataType: "html",
    success: function (t) {
        var e = t;
        $("#a").html(e), (a = !0);
    },
})

There is a check.php file which POSTs counter data and returns {"response":false} if the counter is not set to the correct value.

And, there is a click handler that allows you to modify the counter.

$("#a")
.on("touchstart click", "> *", function (n) {
    if ((n.stopPropagation(), n.preventDefault(), a && !n.handled)) {
        var o = parseInt($(this).attr("src")[7]),
            c = "",
            i = "images/" + (o = o < 9 ? o + 1 : 0) + ".gif";
        $(this).attr("src", i),
            e && clearTimeout(e),
            (e = setTimeout(function () {
                for (var e = 0; e < 7; e++) {
                    var a = $("#a").children()[e];
                    c += $(a).attr("src")[7];
                }
                t(parseInt(c));
            }, 500)),
            (n.handled = !0);
    }
})
.on("dblclick", function (t) {
    t.preventDefault();
});

The format of the digits in the counter is: <img src="images/X.gif">. The JS makes each of the seven digit images in the counter clickable. When clicked, the images are replaced with another one from the server depending on the value of the number represented in the image: i = "images/" + (o = o < 9 ? o + 1 : 0) + ".gif";. Essentially, each click increments the number until 9 is clicked which resets the digit to 0. The function t() is called on the assembled numbers (e.g. 0003456) parsed into an int.

I needed to find the correct counter value because it is later passed into the final AJAX request. I could’ve clicked all day to try to hit the necessary value, which would then trigger the replacement of the counter:

$("#a").replaceWith(
  '<form id="f" method="POST"><input type="text" class="i" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></input><input type="submit" style="position: absolute; left: -9999px"/></form>'
)

Or, I could brute-force it. I decided to send a bunch of POST requests with an incrementing a parameter and a constant b="" parameter, à la:

url: "check.php",
type: "POST",
data: { a: t, b: "" }

After running for quite a while, my script discovered the correct counter value: 0736565.

import requests

a = "0000000"
b = ""
success_str = 'true'

while True:
	r = requests.post("https://www.conficturaindustries.com/check.php", data={'a':a,'b':b})

	# when 'a' is wrong:		r.text = u'{"response":false}'
	# when 'a' is right, expect: 	r.text = u'{"response":true}'
	if success_str in r.text:
		print("Correct Value Found: "+ str(a))
		break

	# pad zeroes to fill 7 digits
	a = str(int(a)+1).zfill(7)

Entering 0736565 in the counter causes it to get replaced by the form. I thought I might’ve needed to brute-force this form too, but I took a step back to consider the other things I knew.

All that was left was:

  • Confictura: Latin for imagination.
  • A Confucius quote
  • Broken Links

Looking at the links again, one broken link with a random string of characters stood out to me:

<img alt="image_bcyufvmducwkydszpwn" src="img/image_bcyufvmducwkydszpwn.jpg">

The other image names were fairly descriptive (image_confictura01.jpg and image_productmenu.jpg) and both had their src and alt ordered the same in the tags. This led me to believe bcyufvmducwkydszpwn was key to solving the form.

I first tried submitting it straight which just reset the form to the counter. I then ran bcyufvmducwkydszpwn through my rotsolver tool and into quipqiup.com but no luck. The likeliest option was that the phrase was encrypted with a key–potentially a Vigenère cipher.

I researched the Confucius quote more deeply and the term confictura, and I tried a bunch of keywords that came up, e.g. perserverance, glory, but had no luck decrypting the ciphertext. I re-read the main blurb over and over:

Confictura Industries is the company of the future. Our mission is to innovate at the speed of evolution, providing world-class service by creating and delivering the best products utilizing the newest technology, remaining true to the core values on which we were founded while revolutionizing the eco-system with unprecedented synergy, leadership, growth, and empowerment. Customer-first. Product-focused. Paradigm-changing. Confictura Industries brings you tomorrow, today. Our mission can be best summed up in the quote that has defined our vision since Day One: “Our greatest glory is not in never falling, but in rising every time we fall.”

Day One: Confucius… Confucius’ birthday maybe? According to Wikipedia, Confucius’ Birthday is thought to be September 28, 551 BC, though is celebrated on September 10 in mainland China. 09/28/551 and 09/10/551 are 7 digits each, so I plugged them into the counter in case it would reveal additional information–it didn’t.

I googled cipher with numeric key and came upon a variant of the Vigenère cipher called the Gronsfeld cipher. I tried to decode bcyufvmducwkydszpwn using the following encryption keys: 0928551 and 0910551 to no avail. I finally tried encrypting bcyufvmducwkydszpwn with 0928551 and got the plaintext: blackanddeepdesires.

Upon entering the passcode into the form, I was taken to a site that contained the only the following line from Alice’s Adventures in Wonderland:

If you drink much from a bottle marked “poison” it is almost certain to disagree with you sooner or later.

I expect this line is part of the ARG, since Mr. Robot didn’t have access to a computer at the time and the message isn’t relevant to the conversation with the Dark Army. That’s the end of this challenge.


Tic-tac-toe

There’s a page ripped out of Tolstoy’s Resurrection with many games of tic-tac-toe in the margins.

Front: first-page

Back: second-page

In most of the games, O looks one turn away from winning against X. There are always two X’s and 1-3 O’s. The one game where X plays 3 times is crossed out, and the X in the top-right corner is replaced with an O. There are also games where the 2 X’s are in the same place and the O’s are placed differently. My first inclination was that this was a pigpen cipher, based on the location of the two X’s.

I decided to assign letters to the different arrangements of X’s in the hope that there were enough characters for the frequency analysis built into quipqiup.com to decipher the plaintext.

X|X|   X| |    | |    | |X   | |    | |    | |X  X| |X   | |   X| |    | |    | |    |X| 
 | |    | |    | |X   | |    | |   X| |    | |    | |    | |    | |   X| |    | |    | |  
 | |   X| |   X| |    |X|   X|X|    |X|   X| |    | |   X| |X   |X|   X| |    |X|X   |X|  
  A      B      C      D      E      F      G      H      I      J      K      L      M

X| |    | |    | |    | |X   | |    | |X   |X|    | |    | |    | |    | |    | |    | |  
X| |    | |X  X| |X  X| |   X| |    | |X  X| |    | |    | |    | |    | |    | |    | | 
 | |    |X|    | |    | |    | |X   | |    | |    | |    | |    | |    | |    | |    | |  
  N      O      P      Q      R      S      T      U      V      W      X      Y      Z

I wrote out the corresponding characters on each page left-to-right and top-to-bottom. I spaced them apart in my notes in the same shape as they appear on the pages, so I could easily find my place.

# Page 1
ABCDAEF
GDHIJK
EILDMG
BCBADMJ
NCCHIBJ
E
A
B
N
I
O
P
NCBIKDP

# Page 2
DPDQHD
R
A
R
A
E
L
D
A
S
N
R
A
E
AHRHTM
EAD

# All Together
ABCDAEFGDHIJKEILDMGBCBADMJNCCHIBJEABNIOPNCBIKDPDPDQHDRARAELDASNRAEAHRHTMEAD

I pasted my string into quipqiup.com, selected statistics mode, and received an answer:

TIMETABLE UNCHANGED LIMITED COMMUNICATION FROM IN HERE REQUEST STAGE TWO STATUS UPDATE

The cleaned up final message reads:

Timetable unchanged. Limited communication from in here. Request stage two status update.


Newspaper

There is a newspaper clipping with Wellick sightings on the front, and a word search on the back that Mr. Robot wanted to get his hands on.

Front: newspaper-front Back: newspaper-back

My first observation was that the word search has suspiciously short words. I then noticed that the first 5 letters were ROTXV and the last 8 letters were ENDROTXV.

# Original
ROTXVDETGPIXD
CWFIDQTSTITGB
XCTSJEDCRWDXR
TDUTKXARDGEQP
RZJEUPRXAXING
TFJTHIHIPIJHD
UQPRZSDDGXBEA
TBTCIPIXDCADD
ZUDGCTMIBTHHP
VTXCEGPNTGEPB
EWATIENDROTXV

# One Line
ROTXVDETGPIXDCWFIDQTSTITGBXCTSJEDCRWDXRTDUTKXARDGEQPRZJEUPRXAXINGTFJTHIHIPIJHDUQPRZSDDGXBEATBTCIPIXDCADDZUDGCTMIBTHHPVTXCEGPNTGEPBEWATIENDROTXV

# One Line, removing ROTXV and ENDROTXV
DETGPIXDCWFIDQTSTITGBXCTSJEDCRWDXRTDUTKXARDGEQPRZJEUPRXAXINGTFJTHIHIPIJHDUQPRZSDDGXBEATBTCIPIXDCADDZUDGCTMIBTHHPVTXCEGPNTGEPBEWATI

# Use my rotsolver script for plaintext
$ rotsolver DETGPIXDCWFIDQTSTITGBXCTSJEDCRWDXRTDUTKXARDGEQPRZJEUPRXAXINGTFJTHIHIPIJHDUQPRZSDDGXBEATBTCIPIXDCADDZUDGCTMIBTHHPVTXCEGPNTGEPBEWATI | grep 15
OPERATIONHQTOBEDETERMINEDUPONCHOICEOFEVILCORPBACKUPFACILITYREQUESTSTATUSOFBACKDOORIMPLEMENTATIONLOOKFORNEXTMESSAGEINPRAYERPAMPHLET ; ROT15

The cleaned up final message reads:

Operation HQ to be determined upon choice of Evil Corp backup facility. Request status of backdoor implementation. Look for next message in prayer pamphlet.


Multiplication Table and Imprint

In the May 26th entry in the journal, Elliot mentions waking up to Mr. Robot doing a bunch of multiplication tables. Later that day, Mr. Robot takes the journal from him, and Leon talks to a Dark Army agent. So, I checked the back page of the journal/composition notebook for a multiplication table.

The multiplication table in the back of the book has an additional row and column. It also has the letters AN written on the top left around the 1 and the letters MZ written at the end columns and rows near the 13’s.

multiplication-table

AN and MZ were familiar because I’ve solved ROT13 ciphers with the tr command before, e.g.:

echo nopqrst | tr '[a-z]' '[n-za-m]'
abcdefg

There also are numbers imprinted on the opposite page, likely the encoded message.

imprint

2 33 8 10 0 54 0 20 55
0 9 0 15 14 25 36 0 63
0 90 144 0 10 0 8 5 0
9 0 63 65 0 15 63 27
12 0 32 0 104 42 0 10
0 5 5 0 2 33 24 0
6 27 108 84

With numbers as the ciphertext opposite from the multiplication table, the table began to seem like a number-based tabula recta. There are only 13 rows/columns and given the multiple written characters, the letters must repeat, i.e. 1-13 would match up for both A-M and N-Z. 0 is notably absent on the table, and I thought it was likely to be punctuation or spacing given the frequency.

multiplication-table-annotated

Some numbers like 8 or 36 show up in several places on the chart, and there was no clear way to decipher which place was correct. Then, at each position there were two letters possible from both the row and the column that could combine for the message. Here is an example of 8:

multiplication-table-annotated2

The message in 8 could be some combination of any of the letters in the rows and columns (AN, BO, DQ, or HU). There was also no guarantee that repeated numbers had the same hidden characters, though some ended up being so. To save time, I created a Python program to generate a list of the potential combinations.

import sys

if len(sys.argv) < 2:
	print 'usage: python solve.py <args>'
	exit()

strings = sys.argv[2:]
res = str(sys.argv[1]) + ': ' + str(strings) + " :"

for i in range(len(strings)):
	for j in range(i+1, len(strings)):

		res += " " + strings[i][0] + strings[j][0]
		res += " " + strings[i][0] + strings[j][1]
		res += " " + strings[i][1] + strings[j][0]
		res += " " + strings[i][1] + strings[j][1]

		res += " " + strings[j][0] + strings[i][0]
		res += " " + strings[j][0] + strings[i][1]
		res += " " + strings[j][1] + strings[i][0]
		res += " " + strings[j][1] + strings[i][1]

print res

Luckily there were repeated numbers which saved me some time. Here was my output for each number in the message organized by line:

# First Line - 2 33 8 10 0 54 0 20 55
2: ['AN', 'BO'] : AB AO NB NO BA BN OA ON
33: ['KX', 'CP'] : KC KP XC XP CK CX PK PX
8: ['AN', 'BO', 'DQ', 'HU'] : AB AO NB NO BA BN OA ON AD AQ ND NQ DA DN QA QN AH AU NH NU HA HN UA UN BD BQ OD OQ DB DO QB QO BH BU OH OU HB HO UB UO DH DU QH QU HD HQ UD UQ
10: ['AN', 'BO', 'ER', 'JW'] : AB AO NB NO BA BN OA ON AE AR NE NR EA EN RA RN AJ AW NJ NW JA JN WA WN BE BR OE OR EB EO RB RO BJ BW OJ OW JB JO WB WO EJ EW RJ RW JE JR WE WR
0: 
54: ['IV', 'FS'] : IF IS VF VS FI FV SI SV
0: 
20: ['BO', 'DQ', 'ER', 'JW'] : BD BQ OD OQ DB DO QB QO BE BR OE OR EB EO RB RO BJ BW OJ OW JB JO WB WO DE DR QE QR ED EQ RD RQ DJ DW QJ QW JD JQ WD WQ EJ EW RJ RW JE JR WE WR
55: ['ER', 'KX'] : EK EX RK RX KE KR XE XR

# Second Line - 0 9 0 15 14 25 36 0 63
0: 
9: ['AN', 'IV', 'CP', 'CP'] : AI AV NI NV IA IN VA VN AC AP NC NP CA CN PA PN AC AP NC NP CA CN PA PN IC IP VC VP CI CV PI PV IC IP VC VP CI CV PI PV CC CP PC PP CC CP PC PP
0: 
15: ['CP', 'ER'] : CE CR PE PR EC EP RC RP
14: ['BO', 'GT'] : BG BT OG OT GB GO TB TO
25: ['ER', 'ER'] : EE ER RE RR EE ER RE RR
36: ['IV', 'DQ', 'LY', 'CP', 'FS', 'FS'] : ID IQ VD VQ DI DV QI QV IL IY VL VY LI LV YI YV IC IP VC VP CI CV PI PV IF IS VF VS FI FV SI SV IF IS VF VS FI FV SI SV DL DY QL QY LD LQ YD YQ DC DP QC QP CD CQ PD PQ DF DS QF QS FD FQ SD SQ DF DS QF QS FD FQ SD SQ LC LP YC YP CL CY PL PY LF LS YF YS FL FY SL SY LF LS YF YS FL FY SL SY CF CS PF PS FC FP SC SP CF CS PF PS FC FP SC SP FF FS SF SS FF FS SF SS
0: 
63: ['GT', 'IV'] : GI GV TI TV IG IT VG VT

# Third Line - 0 90 144 0 10 0 8 5 0
0: 
90: ['JW', 'IV'] : JI JV WI WV IJ IW VJ VW
144: ['LY', 'LY'] : LL LY YL YY LL LY YL YY
0: 
10: ['AN', 'BO', 'ER', 'JW'] : AB AO NB NO BA BN OA ON AE AR NE NR EA EN RA RN AJ AW NJ NW JA JN WA WN BE BR OE OR EB EO RB RO BJ BW OJ OW JB JO WB WO EJ EW RJ RW JE JR WE WR
0: 
8: ['AN', 'BO', 'DQ', 'HU'] : AB AO NB NO BA BN OA ON AD AQ ND NQ DA DN QA QN AH AU NH NU HA HN UA UN BD BQ OD OQ DB DO QB QO BH BU OH OU HB HO UB UO DH DU QH QU HD HQ UD UQ
5: ['AN', 'ER'] : AE AR NE NR EA EN RA RN
0: 

# Fourth Line - 9 0 63 65 0 15 63 27
9: ['AN', 'IV', 'CP', 'CP'] : AI AV NI NV IA IN VA VN AC AP NC NP CA CN PA PN AC AP NC NP CA CN PA PN IC IP VC VP CI CV PI PV IC IP VC VP CI CV PI PV CC CP PC PP CC CP PC PP
0: 
63: ['GT', 'IV'] : GI GV TI TV IG IT VG VT
65: ['ER', 'MZ'] : EM EZ RM RZ ME MR ZE ZR
0: 
15: ['CP', 'ER'] : CE CR PE PR EC EP RC RP
63: ['GT', 'IV'] : GI GV TI TV IG IT VG VT
27: ['CP', 'IV'] : CI CV PI PV IC IP VC VP

# Fifth Line - 12 0 32 0 104 42 0 10
12: ['CP', 'DQ', 'BO', 'FS', 'AN', 'LY'] : CD CQ PD PQ DC DP QC QP CB CO PB PO BC BP OC OP CF CS PF PS FC FP SC SP CA CN PA PN AC AP NC NP CL CY PL PY LC LP YC YP DB DO QB QO BD BQ OD OQ DF DS QF QS FD FQ SD SQ DA DN QA QN AD AQ ND NQ DL DY QL QY LD LQ YD YQ BF BS OF OS FB FO SB SO BA BN OA ON AB AO NB NO BL BY OL OY LB LO YB YO FA FN SA SN AF AS NF NS FL FY SL SY LF LS YF YS AL AY NL NY LA LN YA YN
0: 
32: ['DQ', 'HU'] : DH DU QH QU HD HQ UD UQ
0: 
104: ['HU', 'MZ'] : HM HZ UM UZ MH MU ZH ZU
42: ['GT', 'FS'] : GF GS TF TS FG FT SG ST
0: 
10: ['AN', 'BO', 'ER', 'JW'] : AB AO NB NO BA BN OA ON AE AR NE NR EA EN RA RN AJ AW NJ NW JA JN WA WN BE BR OE OR EB EO RB RO BJ BW OJ OW JB JO WB WO EJ EW RJ RW JE JR WE WR

# Sixth Line - 0 5 5 0 2 33 24 0
0: 
5: ['AN', 'ER'] : AE AR NE NR EA EN RA RN
5: ['AN', 'ER'] : AE AR NE NR EA EN RA RN
0: 
2: ['AN', 'BO'] : AB AO NB NO BA BN OA ON
33: ['KX', 'CP'] : KC KP XC XP CK CX PK PX
24: ['BO', 'LY', 'CP', 'HU', 'DQ', 'FS'] : BL BY OL OY LB LO YB YO BC BP OC OP CB CO PB PO BH BU OH OU HB HO UB UO BD BQ OD OQ DB DO QB QO BF BS OF OS FB FO SB SO LC LP YC YP CL CY PL PY LH LU YH YU HL HY UL UY LD LQ YD YQ DL DY QL QY LF LS YF YS FL FY SL SY CH CU PH PU HC HP UC UP CD CQ PD PQ DC DP QC QP CF CS PF PS FC FP SC SP HD HQ UD UQ DH DU QH QU HF HS UF US FH FU SH SU DF DS QF QS FD FQ SD SQ
0: 

# Seventh Line - 6 27 108 84
6: ['AN', 'FS', 'BO', 'CP'] : AF AS NF NS FA FN SA SN AB AO NB NO BA BN OA ON AC AP NC NP CA CN PA PN FB FO SB SO BF BS OF OS FC FP SC SP CF CS PF PS BC BP OC OP CB CO PB PO
27: ['CP', 'IV'] : CI CV PI PV IC IP VC VP
108: ['IV', 'LY'] : IL IY VL VY LI LV YI YV
84: ['LY', 'GT'] : LG LT YG YT GL GY TL TY

I considered writing another script to output all the possible strings, but I felt that sorting through the output wouldn’t be any more efficient than trying to assemble a message by hand.

# First Line - 2 33 8 10 0 54 0 20 55
2: BA
33: CK
8: DO
10: OR
0: 
54: IS
0: 
20: WO
55: RK

# Second Line - 0 9 0 15 14 25 36 0 63
0: 
9: IN
0: 
15: PR
14: OG
25: RE
36: SS
0: 
63: IT

# Third Line - 0 90 144 0 10 0 8 5 0
0: 
90: WI
144: LL
0: 
10: BE
0: 
8: DO
5: NE
0: 

# Fourth Line - 9 0 63 65 0 15 63 27
9: IN
0: 
63: TI
65: ME
0: 
15: CR
63: IT
27: IC

# Fifth Line - 12 0 32 0 104 42 0 10
12: AL
0: 
32: HQ
0: 
104: MU
42: ST
0: 
10: BE

# Sixth Line - 0 5 5 0 2 33 24 0
0: 
5: NE
5: AR
0: 
2: BA
33: CK
24: UP
0: 

# Seventh Line - 6 27 108 84
6: FA
27: CI
108: LI
84: TY

Some parts were trickier than others, but using 0 as a space made some answers obvious, e.g. IS, IN, IT, BE, HQ. I’m pretty confident I found the right message.

# By Line
BACKDOOR IS WORK IN
 PROGRESS IT
 WILL BE DONE 
IN TIME CRITIC
AL HQ MUST BE
 NEAR BACKUP 
FACILITY

# One Line
BACKDOOR IS WORK IN PROGRESS IT WILL BE DONE IN TIME CRITICAL HQ MUST BE NEAR BACKUP FACILITY

The cleaned up final message reads:

Backdoor is work in progress; it will be done in time. Critical HQ must be near backup facility.


Prayer Pamphlet

After a church group meeting, Elliot found a tri-fold religious pamphlet on the desk in his cell.

Inside:

pamphlet-inside

Outside:

pamphlet-outside

The pamphlet is quite odd. The “comforting words” are seemingly random Bible quotes–not very comforting. So, I figured the chapter and verse numbers must not actually be random, and probably hid a message. The chapter signifies which line in the verse to look at, and the verse number identifies how many words into the verse to count. Here are the first 3 verses:

Proverbs 1:7
> The fear of the LORD is |the| beginning of
  knowledge: but fools despise wisdom and
  instruction

Joshua 2:5
  And it came to pass about the time of shutting of the
> gate, when it was |dark|, that the men went out:
  whither the men went I wot not: pursue after them
  quickly; for ye shall overtake them.

1 Samuel 4:2
  And the Philistines put themselves in array
  against Israel: and when they joined battle, Israel
  was smitten before the Philistines: and they slew of
> the |army| in the field about four thousand men.

I was confident this method was correct because of the mention of the Dark Army. All the others worked the same, but I grabbed two words each from Hosea 1:8-9 and Job 2:9-10.

# Direct Transcription
the dark army I simple men tin gat I me tablet oar range your release wear every closet of in altar get day in form at I on to follow next mess age I sin note In mail

# Altered Spacing 
the dark army Is implementing a tImetable to arrange your release we are very close to final target day informatIon to follow next message Is in note In mail

The cleaned up final message reads:

The Dark Army is implementing a timetable to arrange your release. We are very close to final target day. Information to follow; next message is in note in mail.


D’s Card

Elliot recieved a card from D, likely Darlene.

Inside:

card-inside

Outside:

card-outside

Along with the weird contents of the letter, the postscript stood out.

P.S. I hope you got my first two letters. I sent them on the 6th.

Elliot didn’t mention receiving other letters, and by itself sending two letters on the same day would be odd. I immediately thought to check the first two letters of every sixth word.

# Direct Transcription
He ad qu ar Te RS no We st ab li sh ed mo re in fo on ce yo ug et ho me th et im Ei sc lo se

# Altered Spacing
HeadquarTeRS noW established more info once you get home the timE is close

The cleaned up final message reads:

Headquarters now established. More info once you get home. The time is close.