You Cant C Me

HackTheBox Reversing Challenge

You Cant C Me adalah soal CTF kategori Reversing dengan tingkat kesulitan Easy. Soal ini dibuat oleh MinatoTW dan telah dirilis pada 13 April 2021.

Berikut adalah deskripsi dari tantangan ini:

Can you see me?

Introduction

Setelah mengesktrak archive soal, saya menemukan satu file bernama auth.

➜ ls -lah
total 28K
drwxrwxr-x 3 kali kali 4.0K Mar  5 05:06 .
drwxrwxr-x 5 kali kali 4.0K Mar  5 05:03 ..
-rwxr-xr-x 1 kali kali  15K Dec  1  2020 auth

➜ file auth 
auth: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped

File ini merupakan executable Linux berformat ELF 64-bit LSB PIE. Selain itu, file ini telah di-strip sehingga nama fungsi tidak tersimpan.

Ketika menjalankan program ini, saya mencoba menginput "test" dan hasilnya program memberikan respons:

I said, you can't c me!

Penggunaan perintah strings tidak menemukan hal yang menarik. Terdapat string "this_is_the_password", ketika saya mencoba menginputkannya, program tetap memberikan respons yang sama (gagal).

➜ strings auth 

..<SNIPPED>..
Welcome!
I said, you can't c me!
HTB{%s}
this_is_the_password
m^&&fi
Uo&kUZ'ZUYUc)
;*3$"
..<SNIPPED>..

Proof of Concept

1. Analisis dinamis dengan ltrace

Untuk mendapatkan string yang valid, saya melakukan pengujian dinamis menggunakan ltrace. Dengan alat ini, saya dapat melihat fungsi-fugnsi yang dipanggil ketika program berjalan.

Terlihat bahwa program melakukan validasi input dengan menggunakan fungsi strcmp, yang membandingkan input pengguna dengan string "wh00ps!_y0u_d1d_c_m3". Ketika saya menginputkan string tersebut, program akan menampilkan flag.

2. Analisis statik dengan decompiler

Karena program telah di-strip, saya harus melihat setiap fungsi untuk menentukan mana yang merupakan fungsi utama. Setelah melihat-lihat, saya menemukan fungsi FUN_00401160(void) yang memiliki string "I said, you can't c me!".

Untuk mempermudah analisis, saya mengubah beberapa nama variabel sehingga terlihat seperti berikut:

Dari sini, saya dapat menyimpulkan bahwa terdapat string terenkripsi, yaitu:

  • 0x5517696626265e6d

  • 0x555a275a556b266f

  • 0x29635559

Untuk mendapatkan hasil dekripsi, kita harus menambahkan nilai \n (nilai ASCII 10) ke setiap karakter.

Dari hasil analisis ini, saya mencoba merekode program tersebut menggunakan bahasa C sehingga terlihat seperti berikut:

Hasilnya:

Last updated