summaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authorMalfurious <m@lfurio.us>2021-08-21 14:28:06 -0400
committerMalfurious <m@lfurio.us>2021-08-21 14:28:06 -0400
commit442640f100727a081cf26460992465386fe3a633 (patch)
tree64824fcb57e572625e37aeb9fe17f6eea51412dc /docs
parent4666f79714f40d11d26fb0397c54dde3cbc8e47b (diff)
downloadlib-des-gnux-442640f100727a081cf26460992465386fe3a633.tar.gz
lib-des-gnux-442640f100727a081cf26460992465386fe3a633.zip
Add writeup for RaRCTF 2021 / Boring Flag Checker
Signed-off-by: Malfurious <m@lfurio.us>
Diffstat (limited to 'docs')
-rw-r--r--docs/writeups/RaRCTF_2021/Boring_Flag_Checker.txt236
1 files changed, 236 insertions, 0 deletions
diff --git a/docs/writeups/RaRCTF_2021/Boring_Flag_Checker.txt b/docs/writeups/RaRCTF_2021/Boring_Flag_Checker.txt
new file mode 100644
index 0000000..88451de
--- /dev/null
+++ b/docs/writeups/RaRCTF_2021/Boring_Flag_Checker.txt
@@ -0,0 +1,236 @@
+"Why do all rev challenges have to be boring flag checkers these days?
+Note: This challenge has the same binary as boring-flag-runner"
+
+Category: re (600 points)
+Chall author: willwam845
+Writeup author: malfurious
+
+
+
+Setup
+-----
+As mentioned by the problem description, this problem includes the same binary
+as the boring-flag-runner challenge. RE from that problem revealed the binary
+to be a brainfuck interpreter. It reads brainfuck programs encoded in a custom
+binary format. See the writeup on that problem for more details.
+
+Also included in this problem is a suitable binary-brainfuck program for the
+boring flag runner. When you run it, it asks you for the flag, then tells you
+whether you got it right - a standard flag checker.
+
+I converted this file to an ASCII text brainfuck program using some simple
+tooling written for the other problem. See Appendix A for this program.
+
+
+
+RE
+--
+In order to reverse engineer the brainfuck flag checker, I developed a fairly
+featureful debugger, which now has a home in this repository at
+tools/brainfuck/bf_debug.py. This can be used as a somewhat normal interpreter
+by running the program from the start without setting any breakpoints. Just
+remember to seed the program's text input before starting (it's not interactive
+as of this writing).
+
+The program starts by building and outputting the flag prompt string. During
+this time, the first two memory locations are also set to 1. Next, the flag is
+read from stdin, into memory starting at address 3 (fourth memory location).
+Reading continues until a NULL character is read.
+
+At this point, some processing on the input begins. The head is moved left to
+locate the beginning of the string (there is a NULL byte just before the start
+of the flag in memory), and several passes are made over the flag data
+subtracting fixed values from specific positions in the flag string.
+
+Next, a buffer is generated in memory at a fixed memory location (actually, a
+fixed offset from the start of the user's flag). Each value in this buffer is
+subtracted from each corresponding value in the user's flag. This buffer is
+also our clue for the correct length of the flag to input - there should be just
+enough space for it before the start of this calculated buffer.
+
+There is a little more processing on the flag. However, I didn't fully trace
+all of it out. I did make the key observation that the only modification made
+to the user's flag is to decrement character byte values. Keep this in mind for
+later.
+
+At the end of flag processing, the head is moved back to the beginning of the
+flag in memory. The program scans the data that has resulted from processing to
+ensure that only NULL bytes remain. If any non-zero byte is encountered in the
+scanned space, the head moves back to address 1 and clears that flag. The scan
+also zeroes out memory as it goes.
+
+If the value at address 1 is non-zero at the end, the string
+"Congratulations! You got it!" is displayed.
+
+
+
+Solution
+--------
+After making the discoveries made during RE, I decided to attempt to leak the
+correct flag by feeding the program a string of all FF bytes of the correct
+length.
+
+Such a flag does not validate properly, but leaves the user input memory at the
+end of processing full of delta values. Processing _should have_ reduced these
+bytes to zero, so to calculate the correct flag, I just need to subtract the
+remaining data from the original 'all FF' string I started with. See Appendix B
+for a small script I used to perform this calculation. We are left with:
+
+ rarctf{1_h0p3_y0u-3njoy3d_my-Br41nF$&k_r3v!_d387171751}
+
+
+
+================================================================================
+= Appendix A: prog.bf =
+================================================================================
++>+>>++++[++++>---<]>++.-[--->+<]>++.++++++.+++[->+++<]>.+++++++++++++.[-->+++++
+<]>+++.---[->++++<]>.------------.---.--[--->+<]>-.++[->+++<]>.++++++.----------
+-.++++++.+[->+++<]>++.[-->+<]>+++.[-]<<<<<<<<<+,[>,]+++++[<]>[[->>]]<<[[-<]]++++
++++[[---->>]]<<[[<---]]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[
+-]+++++++++++++++[-<-------->]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<-<++++++++++++[->---------<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>->>++++++++++[-<<---->>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<-<<+++++++++++[->>--------<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>++++++++++++++++[-<<<--->>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<-<<<++++++++++++[->>>---------<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>-->>>>+++++++++++++++[-<<<<--->>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<+++++++++++++[->>>>-------<<<<]>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++[-<<<<<---->>>>>]<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<+++++++++++[->>>>>----------<<<<<]>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-->>>>>>+++++++++++++++[-<<<<<<--->>
+>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<---<<<<<<+++++++++++++[->
+>>>>>-------<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++
+++++++[-<<<<<<<---->>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<
+<<<<+++++++++++++[->>>>>>>---------<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>-->>>>>>>>+++++++++++++++[-<<<<<<<<--->>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<++++++++++[->>>>>>>>----<<<<<<<<]>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++[-<<<<<<<<<----------------->>>>>
+>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+++++++++++++++[->>
+>>>>>>>------<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->>>>>>>>>>
+++++++++++++++[-<<<<<<<<<<--->>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<++++++++++++++++[->>>>>>>>>>------<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++[-<<<<<<<<<<<------------------->>>>>>
+>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<++++++++++++++[->
+>>>>>>>>>>---<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-->>>>>>>>>
+>>>+++++[-<<<<<<<<<<<<----------------->>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<+++++++++++++[->>>>>>>>>>>>--------<<<<<<<<<<<<]>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++++++++++++++[-<<<<<<<<<<<<
+<-->>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<++++++
++++++++++[->>>>>>>>>>>>>---<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>+++++++++++[-<<<<<<<<<<<<<<---------->>>>>>>>>>>>>>]<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<--<<<<<<<<<<<<<<+++++[->>>>>>>>>>>>>>------------
+-----<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->>>>>>>>>>>>>>>+++
+++++++++++++[-<<<<<<<<<<<<<<<--->>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<--<<<<<<<<<<<<<<<++++++[->>>>>>>>>>>>>>>-------------------<<<<<<<<<<<<
+<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->>>>>>>>>>>>>>>>+++++++++++++++[-<<
+<<<<<<<<<<<<<<------->>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<++++++++++[->>>>>>>>>>>>>>>>----<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++++++[-<<<<<<<<<<<<<<<<<------>
+>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+++++++
++++++++++[->>>>>>>>>>>>>>>>>-------<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++[-<<<<<<<<<<<<<<<<<<--------->>>>>>>>>>>
+>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<++++++++++++[->
+>>>>>>>>>>>>>>>>>---<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>+++++++++++[-<<<<<<<<<<<<<<<<<<<--->>>>>>>>>>>>>>>>>>>]<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<+++++++++++++++[->>>>>>>>>>>>>>>>
+>>>---<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>++++++++++++++[-<<<<<<<<<<<<<<<<<<<<-->>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<++++++[->>>>>>>>>>>>>>>>>>>>---------------
+--<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+
+++++++++++++[-<<<<<<<<<<<<<<<<<<<<<----->>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<++++++++++[->>>>>>>>>>>>>>>>>>>>>--------
+--<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+++++++[-<<<<<<<<<<<<<<<<<<<<<<----------------->>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<++++++[->>>>>>>>>>>>>>>>>>>>>>---
+--------------<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>+++++++++++[-<<<<<<<<<<<<<<<<<<<<<<<---->>>>>>>>>>>>>>>>>>>>>>>]<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<--<<<<<<<<<<<<<<<<<<<<<<<++++++[->>>>>>>>>>>>>>>>>
+>>>>>>-------------------<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++[-<<<<<<<<<<<<<<<<<<<<<<<<---->>>>>>>>>>>>>>
+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<++++++++++++
+++[->>>>>>>>>>>>>>>>>>>>>>>>---<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>++++++++++++[-<<<<<<<<<<<<<<<<<<<<<<<<<--------
+->>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<+++++[->>>>>>>>>>>>>>>>>>>>>>>>>-------------------<<<<<<<<<<<<<<<<<<<<<<<<<]
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>+++[-<<<<<<<<<<<<<<<<<<
+<<<<<<<<------------------->>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<--<<<<<<<<<<<<<<<<<<<<<<<<<<+++++[->>>>>>>>>>>>>>>>>>>>>>>>>>---------------
+--<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>++++++++++[-<<<<<<<<<<<<<<<<<<<<<<<<<<<---->>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+++++++++++++[->>>>>>>>>>>>>
+>>>>>>>>>>>>>>--------<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>-<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<++++++++++++++++[->>>>>>>>>>>>>>>>>>>>>>>>>>>>-------
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>[<<[-]>>[-]]>[<<<[-]>>>[-]]>[<<<<[-]>>>>[-]]>[<<<<
+<[-]>>>>>[-]]>[<<<<<<[-]>>>>>>[-]]>[<<<<<<<[-]>>>>>>>[-]]>[<<<<<<<<[-]>>>>>>>>[-
+]]>[<<<<<<<<<[-]>>>>>>>>>[-]]>[<<<<<<<<<<[-]>>>>>>>>>>[-]]>[<<<<<<<<<<<[-]>>>>>>
+>>>>>[-]]>[<<<<<<<<<<<<[-]>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<[-]>>>>>>>>>>>>>[-]]>[<
+<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>[-]]>[<<<<<
+<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>[-]]>[<
+<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>
+>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<
+<[-]>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>[-
+]]>[<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<
+<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>
+>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<
+<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-
+]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-
+]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-
+]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]>[<<<<<
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+<<<<<<<<<<[>++++[++++>---<]>.+[--->+<]>+++.-.-------.+++++++++++.+++[->+++<]>++.
+--[--->+<]>-.+.---------.-----------.--[--->+<]>-.-----------.++++++.-.+++++.+[-
+->+++++<]>-.-.--[->+++<]>-.[->+++++++<]>.++++++.-[---->+<]>+++.++[->+++<]>+.++++
+++++.+++++.[---->+<]>+++.-[--->++<]>-.+++++++++++.[-->+++++<]>-.[--->+<]>-.<<<<<
+<<<<<<<<<<<[-]>[-]]<[>-[--->+<]>-------.-[--->+<]>.+.-----------.--[--->+<]>.-.[
+-->+++++<]>--.-[--->+<]>.+++++.[---->+<]>+++.---[->++++<]>.------------.---.--[-
+-->+<]>-.++[->+++<]>.++++++.-----------.++++++.-[--->+<]>-.[--->+<]>-.[-]]
+
+
+
+================================================================================
+= Appendix B: decode_flag.py =
+================================================================================
+data = [
+ 0x8d, 0x9e, 0x8d, 0x9c, 0x8b, 0x99, 0x84, 0xce,
+ 0xa0, 0x97, 0xcf, 0x8f, 0xcc, 0xa0, 0x86, 0xcf,
+ 0x8a, 0xd2, 0xcc, 0x91, 0x95, 0x90, 0x86, 0xcc,
+ 0x9b, 0xa0, 0x92, 0x86, 0xd2, 0xbd, 0x8d, 0xcb,
+ 0xce, 0x91, 0xb9, 0xdb, 0xd9, 0x94, 0xa0, 0x8d,
+ 0xcc, 0x89, 0xde, 0xa0, 0x9b, 0xcc, 0xc7, 0xc8,
+ 0xce, 0xc8, 0xce, 0xc8, 0xca, 0xce, 0x82
+]
+
+for c in data:
+ c = 0xff - c
+ print(chr(c), end="")
+print("")