# Reverse Engineering

<table><thead><tr><th width="347">Challenge</th><th>Link</th></tr></thead><tbody><tr><td>Yggdarsil (656 Pts)</td><td><a href="#yggdarsil-656-pts">Here</a></td></tr><tr><td>Goliath (699 Pts)</td><td><a href="#goliath-699-pts">Here</a></td></tr></tbody></table>

## Yggdarsil (656 Pts)

### Description

\-

### Solution

Diberikan file mach-o , jadi kami coba jalankan terlebih dahulu menggunakan vm mac-os.

<figure><img src="https://lh7-us.googleusercontent.com/Gm5zQkCbZoVwkog_2CG4bRl8aeo8YTZWT-LaO1-DZXbg3reE1MGhqTXfcVaDtLgl6jOJi4Yu5-o0ZJjwZfEm9H4y0gDZHz86MTpebvfMPzqf0g3UllyB1C20VGcpC_hxKtEFsjqc57wde8SvUUiuHg" alt=""><figcaption></figcaption></figure>

Selanjutnya kita coba lakukan decompile terhadap file tersebut.

<figure><img src="https://lh7-us.googleusercontent.com/9VYf2s2YFE-mmVE4F84s1SX1AC0tTGLY9tOSLdBE4_zvd2E9cwlrEzpVj414SmfH3SlP0Gd5IJcEnBYnGEoJc5iLOceFzPo2GJ1APqD4jSsrmPsq00wceFY-EfZPZeRfDWow9IuDuSs1C1weEMK19Q" alt=""><figcaption></figcaption></figure>

Terlihat bahwa program tersebut dibuat menggunakan rust , pada fungsi main terdapat fungsi untuk memanggil webview , jadi bisa kita simpulkan dari hasil eksekusi dan static analysis bahwa program tersebut melakukan load terhadap web. Ada 2 kemungkinan disini , web bisa online atau di store di program itu sendiri, jadi lakukan string untuk melihat string apa aja yang disimpan oleh program.

<figure><img src="https://lh7-us.googleusercontent.com/n6g5Yai_qAwTR3P6kWhphHauNigdKlwFY-6Ea9yEISLVW_kHSpvWHhNJZlDL_Hl7RHrrIUbPfwC0AVeN4s6k8X5oft-mZZ_11M55d769LG5R3jD2KCyFr68J9hUDGw10Pn0mDTx77z0KYx-u3farzw" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/Gu1yKdnO-sUpBZCZ5UuQxKjGJ5ojBOHAdnM9ulgOpEWm8e_RtWYB5x3r3hzkSItPMl29CTtDu7tRkh6WPbVfVG_JxajJX5BJstbg6A5z66Q90FSWWYHSVYcavYZ7h9PDYzuaNGG98QXZ1awwEYHs9Q" alt=""><figcaption></figcaption></figure>

Terlihat terdapat kode html ,lakukan search pada “Incorrect!”

<figure><img src="https://lh7-us.googleusercontent.com/VRld9XvPv7cSMnbJkFABHmJL4tRoHHYwTTLzRi41fzYOdybwW_udLMxMvgoNNokjiFP6QHacgPOtR4Kbj1Jvui6XwCs0cBTBWWcOlq4tHvawiKBqEYeKzVVXtsaYz-MngeNfuXCyJ-k32Cu3E2b1-Q" alt=""><figcaption></figcaption></figure>

Dapat dilihat pada potongan kode diatas bahwa terdapat pengecekan terhadap hasil encrypt dari input kita.

Berikut adalah kode dari fungsi doEncrypt

```javascript
var $author$project$Main$doEncrypt = F3(
    function (time, passphrase, plaintext) {
   	 return A3(
   		 $billstclair$elm_crypto_string$Crypto$Strings$encrypt,
   		 $elm$random$Random$initialSeed(time),
   		 passphrase,
   		 plaintext);
    });

```

Fungsi tersebut menjalankan fungsi billstclair$elm\_crypto\_string$Crypto$Strings$encrypt dan salah satu argumen juga menjalankan suatu fungsi $elm$random$Random$initialSeed. Jadi tinggal search aja untuk kedua fungsi tersebut dan didapatkan informasi bahwa kode tersebut dibuat menggunakan elm-lang dan fungsi encrypt diambil dari salah satu library yang ada pada elm-lang

<figure><img src="https://lh7-us.googleusercontent.com/g9AXFGkpshQZZlTAsRq8sYmNO9glPofol1GAu_qSdFkCDZRSrAAh5WK2z7jPu7_585a9G-fhN6JKlIS1L5OhpyIGgjM3QOUarLwiZVIHQTwCFIUFSvTUev9_Ih095skC8LFW5q5XjNmzNyVvs26ZfA" alt=""><figcaption></figcaption></figure>

Lakukan install terhadap elm-lang dan juga librarynya , lalu coba fungsinya ( lakukan encrypt decrypt ).

<figure><img src="https://lh7-us.googleusercontent.com/7kLtnqpzXv-6ABV9xy50pgtFCNt1iow0nATQ35DgJmfyBhGI0IxbMIMPgGp0pjl19uckO8s2mg2jTc92RTFj_2iyOyqx1UZk6fEdf6e2ad0RqiqynoQDdtHraHdkCADkSgA_-Ty36LEPCrtsrmc5Ww" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/cvAteemhIZoE5kKBEi5JOMEpp4mmz22NVDj6xQvBCM1ZlR72M2TT66PPd-KKW_vM9jwe_4Irj2ClXW6kKKfsdEX166ksgZcen4SnWtygAu8nHbKGL5oE5t7WlLNTSM4ToqmqFQfLv32nfSZiKLsbXg" alt=""><figcaption></figcaption></figure>

Karena sudah bisa encrypt decrypt maka kita coba lakukan decrypt terhadap ct yang dibandingkan dengan hasil encrypt input kita.

```javascript
A3($author$project$Main$doEncrypt, 1337, 'sacred_key_for_sacred_tree', flag)),
var $author$project$Main$ct = 'LUYEOHmRZ4iocP3J67VJ5Cg6WENfuCS6B5BXeqBjMtARkE7d80JjKU53yfTM\n3mm5TgE74LOtl/q6nedvGI+Qbg==';
```

Karena sudah memiliki key dan ct maka lakukan decrypt

<figure><img src="https://lh7-us.googleusercontent.com/d9u6uQTYnDhbCO6AhuERx7gOEqRE02A2sB1urMBxRgUfLYGitoAFI9lwAb4in9ps-RmehYWSMXN3MQoL6Udhbjk8237kk_1iJr7Z-8NYb-Wlj7GrEsJp2N2QLCle9neWvpmKD2aisyAFntw0cNXVvQ" alt=""><figcaption></figcaption></figure>

Flag : CJ2021{a\_delightful\_flag\_for\_reliable\_reverser}

## Goliath (699 Pts)

### Description

\-

### Solution

Diberikan file ELF 64-bit , kalau diliat dari strings program tersebut dibuat menggunakan rust

<figure><img src="https://lh7-us.googleusercontent.com/hA6J7Bv-AryuZOq7qozp0NrUhZnhQNen21_5AeHzYO25ZIaGFcsIYEC1g0s6p7H6A9foVJPHMTkXd-3bs5ug-bVhSqUKs5VgI71rxocNzjcoaBXeoYw57wwMdiFMEp7P8pCwA12ndsN5IrA_601yow" alt=""><figcaption></figcaption></figure>

Selanjutnya kita coba jalankan file tersebut dan ada yang aneh , yaitu keluar encrypted tapi telat ( sepertinya program lain ) dan hasil md5sum berubah

<figure><img src="https://lh7-us.googleusercontent.com/uU7uBTVziHqA4lJLf7-PfRcUg963CJgrWauvWb7FkktutbLLmx1ZQaxXSSXm1uuGFifglTIkweAE6WY4FgmZcDHxtGKA3MLmM9xLwr1m3BaG4HkFMTTuKKf79NKU9LzEYIautkIB-GNa5aMgahjf4Q" alt=""><figcaption></figcaption></figure>

Maka dari itu kami coba lakukan static analysis dan dynamic analysis.&#x20;

Pertama kita tahu bahwa goliath berubah , berarti terdapat open terhadap file goliath . Dapat dipastikan ketika kita ubah nama filenya maka akan error

<figure><img src="https://lh7-us.googleusercontent.com/_pjULowQcjke58KgaUWsX5UWoKmRy9xqd2bMLfL9-pPHA1lmZYC8ARrB4Cgt2UaMurDDkaVFgN411w7-CdbGN7b9ScOmrNwaXMDA6XrqnLN3Ayd8B0P9oxZuMDk7QlGiWFu0Sli_8qj9PZOoLheBFQ" alt=""><figcaption></figcaption></figure>

Cek fungsi open dan liat reference terhadap fungsi tersebut

<figure><img src="https://lh7-us.googleusercontent.com/irUzJlr_IR66tr2pyBPARymh0JIwvie3wAauBgOg4RiaegDTquOJu4yNrHg37t9jpLCVVzTnJkM32QwmC9y90eiucLmo4pKQk9b0TLcH_2BIEOwUOWBpnCnY5DLinw0WqMfWhNquQCk44XNGRTRDmA" alt=""><figcaption></figcaption></figure>

Hanya dipanggil difungsi main dan sepertinya bisa kita skip

<figure><img src="https://lh7-us.googleusercontent.com/RSO42PDjxrxhNXVMBTzp9yFtc2DvY_ZO5h0J1z1bdyift2-Qrc4EuWlCrflNF8UwLtJe9fl7t_2ERvXSdJvXkzmSP_SQfdHvAQNCsOfd38at-98b3sCNqSIRzYgAEZPGYoA0HrSkjd37_Te28BfMGw" alt=""><figcaption></figcaption></figure>

Selanjutnya cek fungsi open64

<figure><img src="https://lh7-us.googleusercontent.com/38uNlluwMPjnHafZJ2NWncRW_MynGeoOxemewYX3zgMsnjbXdrHsDjQxIv_a4qH-J7Mc7KmkqbIygRErJJzHdZx8pnbEf6lqw_jp_km9oY6cfMXn_RjNUE2YsX0HbwMSeEUBBHCdxVxYfiI90wQ9OQ" alt=""><figcaption></figcaption></figure>

Terlihat bahwa dipanggil oleh beberapa fungsi , jadi kita keep informasi ini. Berdasarkan informasi sebelumnya kita ketahui bahwa ada perubahan terhadap file dengan nama goliath , jadi kita search string goliath.

<figure><img src="https://lh7-us.googleusercontent.com/gNsTnbKP48iTRf7KQqwg-8z04ejMecW9ZkF_biNTrpC9Hhfk7KIDVvWyvuVUeoqJYrJ2k9dj3f8aj47WGGd9e-j_KfxKclKqQTLQpa8gtqe46mGUQGKKr9P6NnQw_2ZBiZok_jALv3cn6NbMErB6_g" alt=""><figcaption></figcaption></figure>

Didapatkan string goliath juga diload di fungsi sub\_8CAC , maka selanjutnya analisis fungsi sub\_8CAC.

Disini kami melakukan analisis beberapa fungsi secara dynamic , adapun berikut untuk beberapa address penting yang kami catat.

```
Num Type       Disp Enb Address        What
1   breakpoint keep y   0x000055555540cd75
    breakpoint already hit 1 time
2   breakpoint keep y   0x0000555555408cbb
    breakpoint already hit 1 time
3   breakpoint keep y   0x0000555555408cd8 -> detect file
    breakpoint already hit 1 time
4   breakpoint keep y   0x0000555555408e0c -> check length
5   breakpoint keep y   0x0000555555408e60
7   breakpoint keep y   0x0000555555408f4d
8   breakpoint keep y   0x0000555555408ed5
9   breakpoint keep y   0x0000555555409019 -> ptrace
10  breakpoint keep y   0x0000555555409034 -> ptrace
11  breakpoint keep y   0x0000555555409041
```

Jadi untuk fungsi ptrace kita bypass , caranya adalah dengan mengubah nilai ecx menjadi 6

<figure><img src="https://lh7-us.googleusercontent.com/fh8XtUUUTUJFn8XGeLbUSZLORcZyxe4FKJD2-dd3jJNpWgMKY3xsDNoovwGR-7YvrwJH7IXmavHZTAaNA_Py9O5iQFtle0tGPCINe-dibmz46T1-A-Sh6mSl8qmXIhq2PhmBIzh53UoK8SkLBv3eXQ" alt=""><figcaption></figcaption></figure>

Selanjutnya akan dilakukan xor value yang ada dimemory $rbp+$rdi dan $r14+$rbx

<figure><img src="https://lh7-us.googleusercontent.com/8d1T4os1mkBABpyhB-7MruVcnP4VnjLxRpXYMAUf69ijdj5PuhYtUKSaN0wVQZ6hn5Kryi0he8QHph7zWMkmgojC3lIYmC2t3-WhdazD1EbdRJG7648J3_QanVDYnJ9dTUk4cAwCUZKXI_lgSA42Cg" alt=""><figcaption></figcaption></figure>

Jadi kita lakukan dump terhadap nilai pada address tersebut, adapun untuk panjangnya kita ketahui dari perbandingan nilai rbx dan r12

<figure><img src="https://lh7-us.googleusercontent.com/5VXgnMJ8_ErKvph1ijK_c770Re2b7XyEFhv-2TEtPcn2cviKbmnF8_GOJryC3Ckr7aNF1NSxgvYTw4qpUfj1XQ4-d2ADzEC5BE5sMxtN5FmXfcu2Iag3_bEbxAV3RiWNhg7LZ2qXJ1OJqKVSLUX8BQ" alt=""><figcaption></figcaption></figure>

Berikut untuk dumpnya

<figure><img src="https://lh7-us.googleusercontent.com/ZeXujHvUYenOimZ2LE23aIr0Bj3EMCixqYtEoEF6UoNsH7xMqK8YbRFDWhnkXsoFnNtwoh-cI9QSgI1hsR8Fop-u6fLUXvgJus08mdmuLxDKsstyVbuDG8H95Xi1t6mX3u2yagRmtJtUuwH75uuvuw" alt=""><figcaption></figcaption></figure>

Selanjutnya tinggal lakukan xor dan cek hasil dari xor tersebut.

```python
key = [0xa1, 0xad, 0xcf, 0xdb, 0x47, 0x95, 0xba, 0x46, 0x49, 0xa4, 0x42, 0xcd, 0x72, 0x84, 0x59, 0x38, 0x35, 0x2a, 0x1a, 0x6a, 0xea, 0x23, 0x47, 0x2e, 0xca, 0x1d, 0xa8, 0x26, 0x3a, 0x73, 0x76, 0x89]
f = open("xor1.bin","rb").read()
res = []
q = open("out","wb")
for i in range(len(f)):
    res.append(f[i]^key[i%len(key)])
q.write(bytes(res))
```

<figure><img src="https://lh7-us.googleusercontent.com/-ntxS0pO_kzpTZBycQLtZryNSi_zSMhf-E1T5RKORLl7Ec7glDaesKLPSECCsd22TrbsRa2KGm91kD3NE9hMX70ffn-vAk6eS0VGZhbfeXOWkGfVVoRjLuM1Whih-FzLSKrB1ogwtfwx9vLDCGvJvQ" alt=""><figcaption></figcaption></figure>

Ternyata file gzip , jadi ubah extensi jadi gz lalu lakukan extract.

![](https://lh7-us.googleusercontent.com/LNilCoT68dstla9aUFjTAMIcthv10W5y9SgzS3l_6LV46u1Boj6TemTrDvksI6M7dR2PVX60RSdDt__Iv-BJAI9zBmkm561Prxo-Z7mDuDeWwvp3qqXA7mFP5toEXMusD2URQLSQo1RAMVcWr4OSjA)

Didapatkan file out yang merupakan file ELF64 bit

<figure><img src="https://lh7-us.googleusercontent.com/g7U00SMT02FWDbuVT3qKgbMwSvHkl3ifWGd5DGoaGzqlLANj46v6QBnhWmL-yrJMtQhiPu1pTYCxi_Q7GLpG-g_gj5jxKUM2th0z2dwjdSswT983uFlKGCVsCDS93h9KoWfgk4DDNlz9lfYhnhrHPA" alt=""><figcaption></figcaption></figure>

Yang mana ketika kita jalankan akan menghasilkan output seperti yang diawal tadi&#x20;

<figure><img src="https://lh7-us.googleusercontent.com/i80-YZHOMVEsL5lR58VERpB5MsiLnyOnmqLdCOzdNmAXQV66GBVT1WR6QFkmx7qklM9RV508vYANEw2d-djxOzxYfLhuuWOEgLXS4APmPiFtOx7tNUrQrGEFR5XGwjTTStVzsQhfakLq6vDQCWKQIA" alt=""><figcaption></figcaption></figure>

Jadi selanjutnya langsung decompile file tersebut

```c
// local variable allocation has failed, the output may be wrong!
void __cdecl main_main()
{
  string length; // [rsp+10h] [rbp-E0h]
  __int64 lengtha; // [rsp+10h] [rbp-E0h]
  string lengthb; // [rsp+10h] [rbp-E0h]
  string lengthc; // [rsp+10h] [rbp-E0h]
  uint8 *elem; // [rsp+18h] [rbp-D8h]
  string elema[3]; // [rsp+18h] [rbp-D8h] OVERLAPPED
  __int64 a; // [rsp+20h] [rbp-D0h]
  __int128 aa; // [rsp+20h] [rbp-D0h] OVERLAPPED
  string ab; // [rsp+20h] [rbp-D0h]
  __interface_{} ac; // [rsp+20h] [rbp-D0h]
  string a_16; // [rsp+30h] [rbp-C0h]
  string plaintext; // [rsp+48h] [rbp-A8h]
  string key_len; // [rsp+58h] [rbp-98h]
  char v13[64]; // [rsp+68h] [rbp-88h] BYREF
  uint8 *key_ptr; // [rsp+A8h] [rbp-48h]
  uint8 *iv_ptr; // [rsp+B0h] [rbp-40h]
  string v16; // [rsp+B8h] [rbp-38h] BYREF
  _OWORD v17[2]; // [rsp+C8h] [rbp-28h] BYREF

  main_ran(32LL);
  key_ptr = elem;
  *((_QWORD *)&aa + 1LL) = main_ran(16LL).str;
  iv_ptr = elem;
  length.str = (uint8 *)"https://gist.githubusercontent.com/vidner/6fede10781c23f76d222fdbec6c4607c/raw/1058e0711938e1c80"
                    	"d69ecfeebd470790a2f4863/viva-el-rey";
  length.len = 131LL;
  *(__uint8 *)&elema[1LL].len = main_doRequest(length);
  lengtha = a;
  *(_QWORD *)&aa = elema[1LL].len;
  crypto_sha256_Sum256(lengtha, *((_QWORD *)&aa + 1LL));
  ((void (*)(void))loc_4564A4)();
  v17[1LL] = 0LL;
  *(runtime_eface_0 *)&elema[1LL].len = runtime_convT2Enoptr((runtime__type_0 *)&stru_6969C0, v13);
  v17[1LL] = aa;
  lengthb.str = (uint8 *)"%x";
  lengthb.len = 2LL;
  *(_QWORD *)&aa = &v17[1LL];
  *((_QWORD *)&aa + 1LL) = 1LL;
  elema[1LL].len = 1LL;
  plaintext = fmt_Sprintf(lengthb, *(__interface_{} *)&aa);
  elema[0LL].str = (uint8 *)"CJ2021{";
  elema[0LL].len = 7LL;
  elema[1LL] = elema[2LL];
  elema[2LL].str = (uint8 *)"}";
  elema[2LL].len = 1LL;
  key_len = runtime_concatstring3((uint8 (*)[32])&v13[32LL], *(string (*)[3])&elema[0LL].str);
  ab.str = key_ptr;
  ab.len = (__int64)key_len.str;
  a_16.str = iv_ptr;
  a_16.len = key_len.len;
  main_Ase256(plaintext, ab, a_16, 16LL);
  v16 = plaintext;
  v17[0LL] = 0LL;
  runtime_convT2Estring((runtime__type_0 *)&e, &v16);
  v17[0LL] = *(_OWORD *)&ac.array;
  lengthc.str = (uint8 *)"Too bad its already encrypted: %v\n";
  lengthc.len = 34LL;
  ac.array = (interface_{} *)v17;
  ac.len = 1LL;
  ac.cap = 1LL;
  fmt_Printf(lengthc, ac);
}

```

Terlihat bahwa program melakukan request terhadap suatu gist lalu melakukan sha256 dan enkripsi aes. Karena terlihat terdapat format flag maka kemungkinan yang di encrypt adalah flag , jadi lakukan breakpoint pada pemanggilan fungsi main\_Ase256 agar tahu value dari argumentnya (flag).

<figure><img src="https://lh7-us.googleusercontent.com/Fpm1mULzP-YgjBOqmuU6DXHvc1abTWN1g1nqUAjZ_6zofWWuh-RRTkQ7RJKSsSPe1AxAYvafv7e-CIEc5ucFPG4wcg_oT45OoJADLbmczU4BNuMDYgrjRrP3_-0ixeU2CnyHCyEd5re9a5KNOwnjUw" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/YHNQEBz62S3PjkYbK5NjqWhMpDXH1PqfTV9-w28aqXho5K5kKc4haIzy0Xa2aYNU2fODcTHukxDHj22T322NigvMo-fJCBRoLyBJyUNw_a_m73tYuK6NdbNey37nYBEl7m7IrWjpy5_DrfBweOstRw" alt=""><figcaption></figcaption></figure>

Adapun berikut breakpoint yang kami set sebelumnya untuk melakukan analisis pada binary tersebut

<figure><img src="https://lh7-us.googleusercontent.com/KMmnj_QenKAh38U8un2UeoiNnSZ3MNQZF25T5cpVkR_l--LrdXOXCSMwChzMHVibDproqGS09AXf6Dx9mjtx7TEBGKH9HxtWwBW4BpiQjcK1I9dqVdPJmHLfCTS-yIckENcWlZhNv4-7wN2bX1SQ9Q" alt=""><figcaption></figcaption></figure>

Flag : CJ2021{eaca9080fa4c6a8bca426dc205e73d96a5e5814fdef8aa7ef0f219c6ba761fb3}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kos0ng.gitbook.io/ctfs/write-up/2021/cyber-jawara-final/reverse-engineering.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
