---
# System prepended metadata

title: Vidner's Rhapsody - ARACTF 2023
tags: [ctf-writeup, ARACTF 2023, reverse engineering]

---

# Vidner's Rhapsody - ARACTF 2023

## Description
Once I was going to send you the program, but do me a favor by retrieving the real output of the program from this generated JSON program tree. Can you?

[Attachments](https://github.com/n1mdacybersec/CTF-Write-Up-Collection/blob/main/2023/ARACTF/Lomba/Reverse%20Engineering/Vidner's%20Rhapsody/Challenge/mytscode.json)

## Solution
This time we got a JSON file that looks like a structure of a program. So the JSON file is an AST (Abstract Syntax Tree) which is a writing of the structure of the original program in tree form.

![AST for program](https://raw.githubusercontent.com/n1mdacybersec/CTF-Write-Up-Collection/main/2023/ARACTF/Lomba/Reverse%20Engineering/Vidner's%20Rhapsody/1.png)

Honestly, I'm too lazy to write the code for this AST to become a program manually. So, I tried to search to make this AST become a code of a program that are faster and automatically. Finally, I found [escodegen](https://github.com/estools/escodegen/tree/master), with this we can convert or translate the AST into Javascript code automatically. You can check the Javascript program below to use escodegen.

```js
const fs = require('fs')
const escodegen = require('escodegen')

let file = fs.readFileSync('mytscode.json')
let parser = JSON.parse(file)
console.log(escodegen.generate(parser));
```

By executing the above program, we'll get this Javascript program.

```js
function mystenc(berserk, guts) {
    var s = [], j = 0, x, res = '';
    for (var i = 0; i < 256; i++) {
        s[i] = i;
    }
    for (i = 0; i < 256; i++) {
        j = (j + s[i] + berserk.charCodeAt(i % berserk.length)) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
    }
    i = 0;
    j = 0;
    for (var y = 0; y < guts.length; y++) {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
        res += String.fromCharCode(guts[y] ^ s[(s[i] + s[j]) % 256]);
    }
    console.log(res);
}
var berserk = 'achenk';
var strenk = [
    244,
    56,
    117,
    247,
    61,
    16,
    3,
    64,
    107,
    57,
    131,
    13,
    137,
    113,
    214,
    238,
    178,
    199,
    4,
    115,
    235,
    139,
    201,
    22,
    164,
    132,
    175
];
mystenc(berserk, strenk);
```

Now we just need to save the code of this Javascript program into .js file and run it.

![Result from running the code](https://raw.githubusercontent.com/n1mdacybersec/CTF-Write-Up-Collection/main/2023/ARACTF/Lomba/Reverse%20Engineering/Vidner's%20Rhapsody/2.png)

## Flag
`ARA2023{j4vAST_l!ke_84831_t0wer_lol}`