Crackme Terbuka

Bersiaplah untuk bersenang-senang meretas! Dalam postingan blog ini, kami akan menunjukkan cara membobol file executable C sederhana yang diamankan dengan kata sandi menggunakan Ubuntu 20.04 LTS. Apakah Anda baru memulai atau pro berpengalaman, tutorial ini memiliki sesuatu untuk semua orang. Saatnya melenturkan keterampilan dunia maya itu!
Semua file yang digunakan dalam tutorial ini dapat ditemukan di GitHub di sini . Anda dapat mengkloning repositori ke lingkungan lokal Anda untuk mengakses file terenkripsi.
Untuk memulai, kita dapat mengeksekusi crackme
file untuk mengamati perilakunya dengan menavigasi ke direktori crackme dan memasukkan perintah berikut:
$ ./crackme
Access Denied
Perintah file
ini digunakan untuk mengidentifikasi jenis file. Ini dilakukan dengan melakukan serangkaian tes dalam urutan tertentu: tes sistem file , tes angka ajaib , dan tes bahasa .

Pengujian ini dirancang untuk menentukan jenis file berdasarkan kontennya dan metadata apa pun yang terkait dengannya. Jika Anda ingin menggunakan file
perintah untuk mengidentifikasi jenis file tertentu, Anda dapat melakukannya dengan menjalankannya file [filename]
di terminal. Sebagai contoh:
$ file crackme
crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped
- File yang dapat dieksekusi yang dirancang untuk dijalankan pada sistem operasi Linux 64-bit
- Dikompilasi untuk arsitektur x86–64 dan ditautkan secara dinamis, artinya bergantung pada pustaka bersama untuk berfungsi
- Ditafsirkan oleh juru bahasa /lib64/ld-linux-x86–64.so.2
- Dibuat untuk GNU/Linux 2.6.24 dan memiliki pengidentifikasi unik yang disebut "BuildID"
- Belum dilucuti, sehingga masih berisi informasi dan simbol debug yang dapat digunakan untuk analisis.
Perlu dicatat juga bahwa ltrace
dapat digunakan bersama dengan alat lain seperti gdb
( GNU Debugger ) untuk menganalisis lebih lanjut perilaku program dan berpotensi merekayasa baliknya yang tidak akan kami gunakan untuk tutorial ini.
Kita dapat menjalankan ltrace
file crack me dengan memasukkan perintah berikut:
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9) = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9) = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9) = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9) = 15
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: ALX
__libc_start_main
adalah fungsi yang mengatur lingkungan program dan memanggil fungsi utamanya. Dibutuhkan berbagai argumen dan disediakan oleh pustaka standar C ( libc ). Ini disebut oleh fungsi titik masuk utama program.- Baris yang diawali dengan
strncmp
menunjukkan bahwa program memanggilstrncmp
fungsi, yaitu fungsi yang membandingkan sejumlah karakter tertentu (dalam hal ini, 9 karakter) dari dua string. String yang dibandingkan tampaknya merupakan berbagai variabel lingkungan (misalnya "SHELL", "PWD", "LOGNAME", dll.) dan string"Passw0rd="
. Tampaknya program sedang memeriksa apakah ada variabel lingkungan yang dimulai dengan string"Passw0rd="
. - Fungsi
puts
dipanggil di bagian akhir dengan string " Access Denied ", yang mungkin menunjukkan bahwa program mencetak pesan ini jika tidak ada variabel lingkungan yang dimulai dengan"Passw0rd="
.
Untuk mengatur variabel lingkungan di Linux, kita bisa menggunakan export
perintah di terminal. Misalnya, untuk menyetel variabel lingkungan bernama Passw0rd
ke nilai test
, kita dapat menjalankan:
export Passw0rd=test
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("Passw0rd=test", "Passw0rd=", 9) = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6) = 1
strlen("test") = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68) = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0) = 1
sprintf("09", "%02x", 0x9) = 2
sprintf("8f", "%02x", 0x8f) = 2
sprintf("6b", "%02x", 0x6b) = 2
sprintf("cd", "%02x", 0xcd) = 2
sprintf("46", "%02x", 0x46) = 2
sprintf("21", "%02x", 0x21) = 2
sprintf("d3", "%02x", 0xd3) = 2
sprintf("73", "%02x", 0x73) = 2
sprintf("ca", "%02x", 0xca) = 2
sprintf("de", "%02x", 0xde) = 2
sprintf("4e", "%02x", 0x4e) = 2
sprintf("83", "%02x", 0x83) = 2
sprintf("26", "%02x", 0x26) = 2
sprintf("27", "%02x", 0x27) = 2
sprintf("b4", "%02x", 0xb4) = 2
sprintf("f6", "%02x", 0xf6) = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...) = 51
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: Here
- Kita sudah mengetahui bahwa baris pertama menunjukkan bahwa
__libc_start_main
fungsi dipanggil dengan empat argumen: alamat fungsi utama, jumlah argumen program, penunjuk ke array argumen program, dan penunjuk ke fungsi yang akan dipanggil saat fungsi utama pengembalian. - Baris berikut menunjukkan serangkaian panggilan ke
strncmp
fungsi, yang membandingkan dua string dan mengembalikan bilangan bulat yang menunjukkan urutan leksikografisnya. Tampaknya program mencoba membandingkan setiap variabel lingkungan dalam sistem dengan string"Passw0rd="
. - Setelah ini, ada panggilan ke
MD5_Init
,MD5_Update
, danMD5_Final
fungsi, yang merupakan bagian dari fungsi hash kriptografi MD5 . Sepertinya program menghitung hash MD5 dari nilai variabel lingkungan Passw0rd. - Selanjutnya, ada panggilan ke
sprintf
fungsi, yang memformat string dan menyimpannya dalam buffer. Tampaknya program memformat byte hash MD5 sebagai nilai heksadesimal dan menyimpannya dalam string. - Output menyertakan panggilan ke
strcmp
fungsi dengan dua string sebagai argumen: "c4032d9e95a93d91b9b595dcfcca640b" dan "098f6bcd4621d373cade4e832627b4f6". Ini menunjukkan bahwa program membandingkan hash MD5 dari kata sandi dengan hash dari variabel lingkungan Passw0rd yang diekspor. - Fungsi
puts
ini dipanggil di bagian akhir dengan string "Access Denied", yang menunjukkan bahwa kata sandi salah. Namun, kemungkinan besar hal ini akan segera teratasi.
Kita dapat menggunakan situs web ini untuk membalikkan string hash ke nilainya.

Sekarang setelah kami menentukan bahwa kata sandi yang di-hash adalah LionelMessi , kami dapat menyetel Passw0rd
variabel lingkungan ke nilai ini dan menjalankan kembali ltrace
perintah untuk melihat apakah menghasilkan hasil yang berbeda. Mari kita coba!
$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

Ingatlah selalu untuk menggunakan kata sandi yang kuat dan unik, dan jangan pernah menggunakan kembali kata sandi di akun yang berbeda.
Nantikan rilis kami yang akan datang di GitHub dari program C yang membandingkan hash MD5 dengan kamus dan membalikkannya ke bentuk string aslinya. Tetap disini!
Kami harap Anda menikmati tutorial tentang cracking file sederhana ini. Jika Anda memiliki komentar atau pertanyaan, jangan ragu untuk meninggalkannya di bagian komentar di bawah. Selamat meretas!