All Articles

CTFlearn Writeup - Finish the flag -

hacking

This is a writeup of Finish the flag in CTFlearn. This challenge is categorised in Reverse Engineering and the difficulty is Easy.

I received a strange letter in the mail, when I unfolded the document inside, I discovered this matrix bar code. Can you figure out what it contains?

I downloaded the letter.zip file and unzip it. It includes these files. The qr.png file includes the flag I have to get. The content of this file is a QR code.

└─[0] <> ls
qr.asm.enc  qr.png  readme.txt

I scanned the QR code in the png file. It looks a base64 format string.

f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAgIAECDQAAACMAgAAAAAAADQAIAACACgABgAFAAEAAAAAAAAAAIAECACABAjFAAAAxQAAAAUAAAAAEAAAAQAAAMgAAADIkAQIyJAECFcAAABXAAAABgAAAAAQAAAAAAAAAAAAAAAAAAC6CgAAALkUkQQIuwEAAAC4BAAAAM2AMcA8B3Qdi5DkkAQIQOkAAAAAVYnlUIDyF4hVAFhd6d////+7AAAAALgBAAAAzYAAAAA5w6nhu7PDvHtqbj09fSAgPFw6ICBfXyAgUDAARkVIYSQnagBRw7NBOGTDunAwbTk5cse5MDQwVjA1ZmYxTGxrOVwwb09cQy9cMDAAQ1RGbGVhcm57CgAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAQIAAAAAAMAAQAAAAAAyJAECAAAAAADAAIAAQAAAAAAAAAAAAAABADx/wgAAADIkAQIAAAAAAAAAgAPAAAA5JAECAAAAAAAAAIAFQAAAOyQBAgAAAAAAAACAB0AAAAUkQQIAAAAAAAAAgAjAAAAmIAECAAAAAAAAAEAKAAAAKiABAgAAAAAAAABADUAAAC5gAQIAAAAAAAAAQA/AAAAgIAECAAAAAAQAAEAOgAAAB+RBAgAAAAAEAACAEYAAAAfkQQIAAAAABAAAgBNAAAAIJEECAAAAAAQAAIAAHFyLmFzbQByYW5kb20AZWZsYWcAcmFuZG9tMgBzZmxhZwBsb29wAGJpdGVfb2ZfZmxhZwBkb25lAF9fYnNzX3N0YXJ0AF9lZGF0YQBfZW5kAAAuc3ltdGFiAC5zdHJ0YWIALnNoc3RydGFiAC50ZXh0AC5kYXRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAAQAAAAYAAACAgAQIgAAAAEUAAAAAAAAAAAAAABAAAAAAAAAAIQAAAAEAAAADAAAAyJAECMgAAABXAAAAAAAAAAAAAAAEAAAAAAAAAAEAAAACAAAAAAAAAAAAAAAgAQAA8AAAAAQAAAALAAAABAAAABAAAAAJAAAAAwAAAAAAAAAAAAAAEAIAAFIAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAAMAAAAAAAAAAAAAAGICAAAnAAAAAAAAAAAAAAABAAAAAAAAAA==

By decoding the base64 code, I got the binary below. It looks an ELF.

In [1]: import base64

In [2]: data = 'f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAgIAECDQAAACMAgAAAAAAADQAIAACACgABgAFAAEAAAAAAAAAAIAECAC
   ...: ABAjFAAAAxQAAAAUAAAAAEAAAAQAAAMgAAADIkAQIyJAECFcAAABXAAAABgAAAAAQAAAAAAAAAAAAAAAAAAC6CgAAALkUkQ
   ...: QIuwEAAAC4BAAAAM2AMcA8B3Qdi5DkkAQIQOkAAAAAVYnlUIDyF4hVAFhd6d////+7AAAAALgBAAAAzYAAAAA5w6nhu7PDv
   ...: Htqbj09fSAgPFw6ICBfXyAgUDAARkVIYSQnagBRw7NBOGTDunAwbTk5cse5MDQwVjA1ZmYxTGxrOVwwb09cQy9cMDAAQ1RG
   ...: bGVhcm57CgAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAQIAAAAAAMAAQAAAAAAyJAECAAAAAADAAIAAQAAAAAAAAAAAAAABAD
   ...: x/wgAAADIkAQIAAAAAAAAAgAPAAAA5JAECAAAAAAAAAIAFQAAAOyQBAgAAAAAAAACAB0AAAAUkQQIAAAAAAAAAgAjAAAAmI
   ...: AECAAAAAAAAAEAKAAAAKiABAgAAAAAAAABADUAAAC5gAQIAAAAAAAAAQA/AAAAgIAECAAAAAAQAAEAOgAAAB+RBAgAAAAAE
   ...: AACAEYAAAAfkQQIAAAAABAAAgBNAAAAIJEECAAAAAAQAAIAAHFyLmFzbQByYW5kb20AZWZsYWcAcmFuZG9tMgBzZmxhZwBs
   ...: b29wAGJpdGVfb2ZfZmxhZwBkb25lAF9fYnNzX3N0YXJ0AF9lZGF0YQBfZW5kAAAuc3ltdGFiAC5zdHJ0YWIALnNoc3RydGF
   ...: iAC50ZXh0AC5kYXRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAAQAAAAYAAACAgA
   ...: QIgAAAAEUAAAAAAAAAAAAAABAAAAAAAAAAIQAAAAEAAAADAAAAyJAECMgAAABXAAAAAAAAAAAAAAAEAAAAAAAAAAEAAAACA
   ...: AAAAAAAAAAAAAAgAQAA8AAAAAQAAAALAAAABAAAABAAAAAJAAAAAwAAAAAAAAAAAAAAEAIAAFIAAAAAAAAAAAAAAAEAAAAA
   ...: AAAAEQAAAAMAAAAAAAAAAAAAAGICAAAnAAAAAAAAAAAAAAABAAAAAAAAAA=='

In [3]: encodedBytes = base64.b64decode(data)

In [4]: print(encodedBytes)
b"\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00\x01\x00\x00\x00\x80\x80\x04\x084\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x004\x00 \x00\x02\x00(\x00\x06\x00\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x08\x00\x80\x04\x08\xc5\x00\x00\x00\xc5\x00\x00\x00\x05\x00\x00\x00\x00\x10\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x90\x04\x08\xc8\x90\x04\x08W\x00\x00\x00W\x00\x00\x00\x06\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\n\x00\x00\x00\xb9\x14\x91\x04\x08\xbb\x01\x00\x00\x00\xb8\x04\x00\x00\x00\xcd\x801\xc0<\x07t\x1d\x8b\x90\xe4\x90\x04\x08@\xe9\x00\x00\x00\x00U\x89\xe5P\x80\xf2\x17\x88U\x00X]\xe9\xdf\xff\xff\xff\xbb\x00\x00\x00\x00\xb8\x01\x00\x00\x00\xcd\x80\x00\x00\x009\xc3\xa9\xe1\xbb\xb3\xc3\xbc{jn==}  <\\:  __  P0\x00FEHa$'j\x00Q\xc3\xb3A8d\xc3\xbap0m99r\xc7\xb9040V05ff1Llk9\\0oO\\C/\\00\x00CTFlearn{\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x80\x04\x08\x00\x00\x00\x00\x03\x00\x01\x00\x00\x00\x00\x00\xc8\x90\x04\x08\x00\x00\x00\x00\x03\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\xf1\xff\x08\x00\x00\x00\xc8\x90\x04\x08\x00\x00\x00\x00\x00\x00\x02\x00\x0f\x00\x00\x00\xe4\x90\x04\x08\x00\x00\x00\x00\x00\x00\x02\x00\x15\x00\x00\x00\xec\x90\x04\x08\x00\x00\x00\x00\x00\x00\x02\x00\x1d\x00\x00\x00\x14\x91\x04\x08\x00\x00\x00\x00\x00\x00\x02\x00#\x00\x00\x00\x98\x80\x04\x08\x00\x00\x00\x00\x00\x00\x01\x00(\x00\x00\x00\xa8\x80\x04\x08\x00\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\xb9\x80\x04\x08\x00\x00\x00\x00\x00\x00\x01\x00?\x00\x00\x00\x80\x80\x04\x08\x00\x00\x00\x00\x10\x00\x01\x00:\x00\x00\x00\x1f\x91\x04\x08\x00\x00\x00\x00\x10\x00\x02\x00F\x00\x00\x00\x1f\x91\x04\x08\x00\x00\x00\x00\x10\x00\x02\x00M\x00\x00\x00 \x91\x04\x08\x00\x00\x00\x00\x10\x00\x02\x00\x00qr.asm\x00random\x00eflag\x00random2\x00sflag\x00loop\x00bite_of_flag\x00done\x00__bss_start\x00_edata\x00_end\x00\x00.symtab\x00.strtab\x00.shstrtab\x00.text\x00.data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x80\x80\x04\x08\x80\x00\x00\x00E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\xc8\x90\x04\x08\xc8\x00\x00\x00W\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\xf0\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x04\x00\x00\x00\x10\x00\x00\x00\t\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x02\x00\x00'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"

I wrote the binary content into a file and executed it.

execute_file = open("a.out", "wb")
execute_file.write(encodedBytes)

I got just CTFlearn{, but confirmed this file is executable.

└─[0] <> ./a.out
CTFlearn{

This is the resulf of debugging the execute file into assembly format. It looks very simple and seems there is a loop.

└─[0] <> objdump -S -M intel a.out

a.out:     file format elf32-i386


Disassembly of section .text:

08048080 <_start>:
 8048080:       ba 0a 00 00 00          mov    edx,0xa
 8048085:       b9 14 91 04 08          mov    ecx,0x8049114
 804808a:       bb 01 00 00 00          mov    ebx,0x1
 804808f:       b8 04 00 00 00          mov    eax,0x4
 8048094:       cd 80                   int    0x80
 8048096:       31 c0                   xor    eax,eax

08048098 <loop>:
 8048098:       3c 07                   cmp    al,0x7
 804809a:       74 1d                   je     80480b9 <done>
 804809c:       8b 90 e4 90 04 08       mov    edx,DWORD PTR [eax+0x80490e4]
 80480a2:       40                      inc    eax
 80480a3:       e9 00 00 00 00          jmp    80480a8 <bite_of_flag>

080480a8 <bite_of_flag>:
 80480a8:       55                      push   ebp
 80480a9:       89 e5                   mov    ebp,esp
 80480ab:       50                      push   eax
 80480ac:       80 f2 17                xor    dl,0x17
 80480af:       88 55 00                mov    BYTE PTR [ebp+0x0],dl
 80480b2:       58                      pop    eax
 80480b3:       5d                      pop    ebp
 80480b4:       e9 df ff ff ff          jmp    8048098 <loop>

080480b9 <done>:
 80480b9:       bb 00 00 00 00          mov    ebx,0x0
 80480be:       b8 01 00 00 00          mov    eax,0x1
 80480c3:       cd 80                   int    0x80

This loop is executed up to 7times.

08048098 <loop>:
 8048098:       3c 07                   cmp    al,0x7
 804809a:       74 1d                   je     80480b9 <done>

In the bite_of_flag function, a character is defined. I assumed this character is the content of the flag.

80480ac:       80 f2 17                xor    dl,0x17
80480af:       88 55 00                mov    BYTE PTR [ebp+0x0],dl

By debugging with gdb, I found the characters have hex format.

gdb-peda$ i registers dl
dl             0x51                0x51
In [1]: chr(0x51)
Out [1]: 'Q'

By debugging the loop, I can get the all 7 characters, but it’s bit combersom. Therefore, I wrote the simple script below to get all characters.

import gdb

gdb.execute('break *0x80480af')
gdb.execute('run')

flag = ''
for i in range(7):
    dl = gdb.parse_and_eval('$dl')
    flag += chr(dl)

    gdb.execute('continue')

print("CTFlearn{" + flag)

By executing the command below, I got the flag.

└─[0] <> gdb a.out -x ./exploit.py
CTFlearn{QR_v30}

As it’s written in the readme.txt, you can get the original assmembly file by this command below.

openssl enc -d -aes-256-cbc -pbkdf2 -k CTFlearn{QR_v30} -in qr.asm.enc -out qr.asm