The Problem

The hamsters have triumphed! We found an open Github repository! It looks like some sort of game; perhaps they’re planning to trick our humans into playing it. We need to know if there’s any data hidden in the game that might harm our humans.
Note: You’ll need to prepend “flag-” to the flag.

- https://squarectf.com/challenges/the-turing-agent

The github repo in the link above contains the following files:

4.0K drwxr-xr-x 3 cpacho users 4.0K Oct  6 13:29 ..
4.0K drwxr-xr-x 3 cpacho users 4.0K Oct  6 11:29 .
4.0K -rw-r--r-- 1 cpacho users 1.4K Oct  6 10:11 bighint.txt
4.0K drwxr-xr-x 8 cpacho users 4.0K Oct  6 10:11 .git
 32K -rw-r--r-- 1 cpacho users  32K Oct  6 10:11 mission.gb
4.0K -rw-r--r-- 1 cpacho users 1.7K Oct  6 10:11 README.txt
4.0K -rw-r--r-- 1 cpacho users  804 Oct  6 10:11 smallhint.txt
4.0K -rw-r--r-- 1 cpacho users  713 Oct  6 10:11 tools.txt

The challenge was located in mission.gb, a gameboy ROM. To start, install visualboyadvance from the kali repos and load up mission.gb. Once the gameboy rom is loaded up, it asks for a code. The code is 16 digits and can contain “UP”, “DOWN”, “LEFT”, “RIGHT”, “A”, or “B”.

Entering an invalid code will result in a failure message of “NO GOOD.”

The Solution

Loading the binary in radare2 (r2 -A mission.gb) and looking at the file’s strings was very useful. The following strings seemed important:

vaddr=0x00002bf8 paddr=0x00002bf8 ordinal=122 sz=8 len=7 section=rombank00 type=ascii string=I'M IN.
vaddr=0x00002c1b paddr=0x00002c1b ordinal=123 sz=9 len=8 section=rombank00 type=ascii string=NO GOOD.

The success string (I’M IN) is called within function fcn.00002b26 and the failure string is called within fcn.00002c00. The goal is to land in the success function. The success/failure functions are only called in one place in the binary.

There are two conditional statements that need to be traversed before entering the WIN or FAIL functions. Nop out the two compares (0x00002b15 & 0x00002b19), and that will lead directly to the WIN function!

0x00002b0b      361e           ld [hl], 0x1e
0x00002b0d      f800           ld hl, sp + 0x00
0x00002b0f      56             ld d, [hl]
0x00002b10      1e00           ld e, 0x00
0x00002b12      7a             ld a, d
0x00002b13      d610           sub 0x10
0x00002b15      00             nop
0x00002b16      09             add hl, bc
0x00002b17      7b             ld a, e
0x00002b18      b7             or a
0x00002b19      00             nop
0x00002b1a      05             dec b
0x00002b1b      cd262b         call fcn.00002b26

Now, the following will appear when the patched gameboy rom is opened: