[ångstromCTF 2019] – High Quality Checks

Challenge Description : After two break-ins to his shell server, kmh got super paranoid about a third! He’s so paranoid that he abandoned the traditional password storage method and came up with this monstrosity! I reckon he used the flag as the password, can you find it?

 

Diberikan file executable bernama high_quality_checks, ketika dijalankan file tersebut meminta input “enter your input :” seperti gambar berikut ini :

ketika di-input dengan string asal seperti “gimme access”, output yang diberikan adalah flag is too short sehingga selanjutnya saya menggunakan function string untuk melihat string apa saja yang terdapat pada file tersebut dan ternyata terdapat string %19s yang menandakan bahwa string yang diminta harus memiliki panjang 19 karakter

setelah itu, saya mencoba untuk melakukan input asal dengan string “abcdefghijklmnopqrs” yang merupakan alfabet dengan urutan 1-19. Setelah di-input, output yang diberikan adalah “that’s not the flag” sehingga dengan menggunakan readelf, saya mencoba untuk melihat function apa saja yang terdapat pada file tersebut.

Pada hasil tersebut terlihat bahwa terdapat function check yang kemungkinan berfungsi untuk melakukan checking terhadap input user. Setelah itu, dengan menggunakan gdb saya mencoba untuk melakukan disassemble pada function check pada file tersebutpada function check, terdapat function-function yang dipanggil secara berurutan antara lain : d, v, u, k, k, w, b, b, z, s.

Setelah itu, saya mencoba untuk melakukan disassemble juga terhadap function-function yang terdapat pada function check tersebut.

 

CHECK PERTAMA : input = “abcdefghijklmnopqrs”

Pada function d,  saya melakukan breakpoint pada alamat memori 0x00000000004008f3 seperti gambar berikut ini :

alamat memori 0x00000000004008f3  melakukan perintah compare “eax” dengan “0x30313763” atau c710 pada ASCII. Ketika di-run dengan input “abcdefghijklmnopqrs“, maka terlihat bahwa eax berisi string “mnop” seperti gambar berikut ini :

Sehingga, function d berfungsi untuk melakukan pengecekan terhadap karakter ke 13 sampai karakter ke 16. Selanjutnya, kita dapat mengubah input dari “abcdefghijklmnopqrs” menjadi “abcdefghijklc710qrs“. Setelah dijalankan ulang, hasil c710 sesuai dengan “0x30313763”.

 

CEK KEDUA : input = “abcdefghijklc710qrs”

Selanjutnya, saya mencoba untuk melakukan disassemble terhadap function “v” sebagai function pengecekkan kedua dan hasilnya adalah sebagai berikut :

pada function v, terdapat instruksi untuk memanggil function “n” yang jika di-disassemble hasilnya adalah sebagai berikut :

Secara garis besar, function “n” berfungsi untuk melakukan shift bytes sebesar 1 terhadap input yang diberikan. Pada function “v” input yang diberikan adalah 0xac. Setelah itu, saya memasukkan breakpoint pada alamat memori :

  • 0x0000000000400653 <+0>: push rbp -> pada function v untuk melihat string apa yang dimasukkan dan hasilnya sebagai berikut
  • Setelah itu, pada function v, terdapat perintah “XOR eax, 0x37” sehingga input “a” akan berubah menjadi ‘V’.
  • 0x0000000000400675 <+34>: cmp ebx,eax -> untuk melihat hasi compare antara ebx yang merupakan hasil return dari function “n” dengan eax yang merupakan input dari function “v” dengan hasil sebagai berikut :

dari hasil tersebut, terlihat bahwa function kedua melakukan pemeriksaan terhadap karakter pertama sesuai input “abcdefghijklc710qrs” dan ternyata huruf pertama yang sesuai adalah “a” sehingga kita tidak perlu mengubah huruf pertama string tersebut.

 

CEK KETIGA : input = “abcdefghijklc710qrs”

Function ketiga yang dipanggil adalah function “u” dan hasil dari disassemble terhadap function u adalah sebagai berikut :

terlihat bahwa terdapat 2 function yang dipanggil pada function u yaitu function “n” dan function “o” secara garis besar function u bekerja sebagai berikut :

  1. memanggil fungsi “n” untuk memeriksa huruf “q” (karakter ke-17) dan memasukkan hasil dari proses fungsi “n” (bit shift 1 ke kanan) dari input 0xdc dan dengan menggunakan kalkulator hex ke ascii pada link ini didapatkan hasil huruf “n”. Setelah itu melakukan pengecekkan apakah karakter ke-17 adalah n. Sehingga input menjadi : abcdefghijklc710nrs”
  2. Setelah itu function “u”  memeriksa karakter ke-18 dari input (huruf “r”) sesuai dengan 0x35053505 atau didapatkan angka “5” sehingga karakter ke-18 menjadi “5”.

CEK KEEMPAT dan KELIMA : input = “abcdefghijklc710n5s”

function yang dipanggil pada pengecekan keempat adalah function “k” yang melakukan pengecekan terhadap huruf “f” (karakter ke-6).

Function “k” menyocokkan apakan input sesuai dengan 0x660f660f dan dengan menggunakan hex to ascii converter pada web diatas, didapatkan bahwa karakter ke-6 adalah huruf “f” sehingga tidak terjadi perubahan input.

pada pengecekkan kelima, yang di-check adalah karakter “j”(huruf ke-10) dengan proses seperti cek keempat, sehingga input menjadi : “abcdefghifklc710n5s”.

CEK KEENAMinput = “abcdefghifklc710n5s”

pada pengecekan keenam, karakter yang di-check adalah karakter “bcd”(huruf ke 2 sampai 4 ) menggunakan function “w”.

pada function “w”, karakter yang di check dapat dilihat pada register “RAX” dan setelah itu, function w akan memastikan apakan input ‘bcd’ sesuai dengan 0x667463 atau jika diconvert menjadi ASCII akan menghasilkan huruf “ctf”. Sehingga kita dapat mengubah input menjadi “actfefghifklc710n5s”.

CEK KETUJUH : input = “actfefghifklc710n5s”

pada pengecekkan karakter ketujuh menggunakan function “w”, karakter yang diambil adalah karakter “s” dari input (karakter ke-19) kemudian dari hasil. Ketika dijalankan dengan debug untuk melihat input apa yang diinginkan hasilnya sebagai berikut :

input yang diinginkan adalah karakter ‘}’ pada register rax. Sehingga input diubah menjadi : actfefghifklc710n5}

 

CHECK KEDELAPAN : input = “actfefghifklc710n5}”

karakter yang di-check adalah huruf “e” (huruf ke-5) dengan function seperti check ketujuh dan didapatkan hasil sebagai berikut :

sehingga input menjadi :actf{fghifklc710n5}

CHECK KESEMBILAN : input : “actf{fghifklc710n5}”

check kesembilan dilakukan dengan function “z”.  Terdapat 2 karakter yang akan diperiksa. Karakter pertama adalah karakter ‘g’ (huruf ke-7) seperti gambar berikut ini :

dari gambar tersebut, terlihat bahwa huruf ‘g’ kan di-check apakah akan sesuai dengan 0x75 atau huruf “u” pada ASCII, sehingga kita dapat mengubah input menjadi : actf{fuhifklc710n5}

Setelah itu, karakter ‘h’ juga akan di-check apakah sesuai dengan ‘n’sehingga, kita kembali merubah input menjadi actf{funifklc710n5}. Setelah itu, yang di-check selanjutnya adalah huruf “k” (karakterr ke-11) apakah sesuai dengan huruf “u” seperti gambar berikut :

Sehingga, input kita ubah kembali menjadi : actf{funifulc710n5}. lalu huruf terakhir yang di-check adalah huruf ‘l’ yang seharusnya diubah menjadi huruf n (0x6e). Sehingga kita merubah input lagi menjadi actf{funifunc710n5}.CHECK KESEPULUH : input = “actf{funifunc710n5}”

huruf terakhir yang di-check adalah huruf i dan pada fungsi s, dilakukan pengecekan apakah jika diproses huruf i akan menghasilkan hasil seperti berikut :

 

dengan kalkulator online ke ASCII, didapakan hasil : _/_/ sehingga, kita dapat mengubah huruf “i” menjadi “_” atau “/” dan setelah di-test, maka hasilnya adalah “_” sehingga input diubah menjadi : actf{fun_func710n5}. setelah itu, saya mencoba memasukkan hasil tersebut dan ternyata benar.

flag = actf{fun_func710n5}

 

Leave a Reply

Your email address will not be published. Required fields are marked *