Decrypting Lytton Labs Cryptoware 2

以下のファイルが与えられた。

複号プログラムをGhidraで逆コンパイルすると、 1個のコマンドライン引数を受け取り、拡張子 .oodev のファイルを main.findFilesWithExt 関数で探して複号することが読み取れた。
安全のため os.Remove の呼び出し (Ghidra上の表示で08150b2b、ファイルの0x108B2Bバイト目 (0-origin) からの5バイト e8 40 7e f8 ff) をNOP (90) で埋め、 CS50 IDEで実行すると、引数は32文字でないといけないようだった。

次に、暗号化プログラムをGhidraで逆コンパイルすると、 拡張子 .llabs のファイルを main.findFilesWithExt 関数で探し、main.encryptAes 関数で暗号化しているのが読み取れた。
そこで、これもos.Remove の呼び出し (Ghidra上の表示で0822ea83、ファイルの0x1E6A83バイト目 (0-origin) からの5バイト e8 98 5b ec ff) をNOP (90) で埋め、 CS50 IDE上で実行してみることにした。

暗号化対象の空のファイル hoge.llabs を用意した上で、改造した暗号化プログラムをCS50 IDE上のGDBで実行し、 main.encryptAes 関数を呼び出す直前の 0x0822ea35 にブレークポイントを置いて観察した。
すると、以下のように、%esp + 0x0c に書かれているアドレスに何かのデータがあることを発見した。

These files were given:

Decompiling the decryptor via Ghidra, I found that it takes one command-line argument, searches for files with the extension .oodev using the function main.findFilesWithExt, and decrypts the files.
I filled the part to call the function os.Remove (the 5 bytes e8 40 7e f8 ff from 08150b2b on Ghidra, or 0x1E6A83-rd byte of the file (the first byte is 0th)) with NOP (90) for safety,
and executed the decryptor on CS50 IDE. As a result, I found that the argument should be 32 characters.

Then, I decompiled the encryptor via Ghidra. I found that it searches for files with the extension .llabs using the function main.findFilesWithExt, and encrypts the files using the function main.encryptAes.
I decided to fill the part to call the function os.Remove (the 5 bytes e8 98 5b ec ff from 0822ea83 on Ghidra, or 0x1E6A83-rd byte of the file (the first byte is 0th)) with NOP (90) for safety,
and to try executing that on CS50 IDE.

I put an empty file to encrypt hoge.llabs and executed the patched encryptor with GDB on CS50 IDE.
I put a breakpoint to 0x0822ea35 (just before calling the function main.encryptAes) and investigated.
As a result, I found that there is some data from the address written in %esp + 0x0c like this:

encrypter_gdb.txt

ここで発見したデータを16進数で表した d8f5c876b36f019254a7307c1eb0fe09 を引数として改造した複号プログラムを用いると、 与えられたデータを複号することができ、復号結果がflagを含んでいた。

I used the data found here expressed in hexadecimal d8f5c876b36f019254a7307c1eb0fe09 as the argument to execute the patched decryptor.
It succeeded to decrypt the data given, and the result of decryption contained the flag.

flag{PEANUT-BUTTER-Crunch-Mixed-With-Cocoa-Puffs-Beats-All-Those-Cereals!}

DEADFACE CTF