Tes Kesabaran Saya oleh Akademi Keamanan Titik Centang

Saya menyebutkan program Akademi Keamanan Check Point beberapa kali di Habré: intinya adalah bahwa perusahaan Check Point mengumumkan kompetisi dalam format Capture the Flag di musim panas, di mana pengalaman masa lalu peserta tidak penting, tetapi hanya kemampuannya untuk mengungkap cyber. teka-teki. Berdasarkan hasil kompetisi ini, perusahaan merekrut dua puluh peserta untuk kursus profesional tiga bulan dalam keamanan cyber, dan semua peserta dari awal kursus menerima gaji penuh seorang spesialis di KB, di bawah kewajiban untuk bekerja di perusahaan dua tahun setelah akhir kursus.


Dalam kompetisi KKP, bendera bahkan bisa menjadi gambar, seperti ini.

Pemilihan peserta selesai pada bulan Agustus, tetapi situs web kontes akan terus beroperasi hingga musim panas mendatang, dan saya mengundang mereka yang ingin mendaftar dan mencoba tangan mereka demi minat olahraga. Kompetisi ini terdiri dari 12 teka-teki dengan kompleksitas yang bervariasi, diberi nilai mulai dari 10 hingga 150 poin.
Di sini saya ingin mengurai teka-teki "Uji Kesabaran Saya" dari kategori "Kejutan". Dia kesulitan sedang (50 poin), dan inilah teks lengkapnya:
Hai yang disana
Kami menemukan ini dapat dieksekusi di komputer pembuat jam lokal.
Dikabarkan bahwa entah bagaimana pembuat jam itu adalah satu-satunya orang yang berhasil memecahkannya.
Kamu pikir kamu sebagus pembuat jam?
Catatan: File ini tidak berbahaya dengan cara apa pun
Dengan referensi - biner 32-bit untuk Windows, yang disumpah oleh beberapa antivirus , tetapi jika Anda masih menjalankannya, tampilannya seperti ini:



Di dalam biner dienkripsi; Itu menolak untuk berjalan di bawah debugger; jika Anda mencoba menghubungkan debugger ke sana saat sedang berjalan, itu segera berakhir. Mungkin, spesialis dari Check Point membungkus teka-teki mereka dalam paket crypto-pack, dipinjam dari semacam malvari.

Bagaimana kita menebak angka yang dibuat oleh pembuat jam itu?

Ada dua cara. Yang pertama secara kondisional dapat disebut "ada kekuatan, tidak ada pikiran": jika program tidak dapat di-debug hidup-hidup, maka kita akan men-debug yang mati!

Kami meluncurkan "Task Manager" 32-bit (\ Windows \ SysWOW64 \ taskmgr.exe), klik kanan pada proses misterius, dan pilih Buat file dump. (Task Manager 64-bit untuk proses 32-bit menciptakan dump emulator wow64cpu, yang lebih sulit untuk dikerjakan.)

Kami mencari di dump dan melihat bahwa setidaknya baris di dalamnya sudah didekripsi:



Tetapi garis-garis dengan nomor yang disembunyikan atau bendera belum terlihat.

Kita beralih ke senjata kaliber utama: WinDbg (X86) -> Open Crash Dump ...



Di mana di memori adalah garis yang ingin kita lihat dicetak - "Kerja bagus teman saya!"?
Perintah lm memungkinkan Anda untuk menentukan bahwa biner dimuat dari 01140000 ke 015b2000 ; lalu sa 01140000 015b2000 "Good job my friend!" menemukan string pencarian di 0115a0d0 :



Sekarang mari kita cari di mana baris ini dicetak: mungkin beberapa perintah berisi byte d0 a0 15 01 sesuai dengan alamat baris yang Anda cari? ( sb 01140000 015b2000 d0 a0 15 01 )

Semoga beruntung - tim seperti itu ditemukan:



Apa kode di sekitar perintah ini? ( ub 011412f7; u 011412f7 )



Kita melihat bahwa tergantung pada hasil fungsi 01141180 baik pesan yang diinginkan dicetak, atau "Salah ..."

Kode fungsi 01141180 menempati tiga layar; cukup mudah untuk melihat bahwa ini adalah implementasi dari strcmp() , di mana panggilan ke Sleep(700) telah ditambahkan. Belum jelas mengapa ada Sleep() ; tetapi masih tidak mempengaruhi hasil fungsi, jadi sebaiknya kita mencari tahu apa yang dibandingkan dengan string:



Dua petunjuk sama dengan ebp-14h dan ebp-24h ebp-14h ; yang kedua dilewatkan ke fungsi 011410b0 sebagai 011410b0 .
Bukankah ini fungsi yang meminta nomor yang disembunyikan? Mari kita periksa tumpukan panggilan ( k ):



Ya, itu dia!

Skema umum dari teka-teki itu sekarang jelas: firasat pengguna disimpan pada ebp-24h , angka yang ebp-14h pada ebp-14h , kemudian mereka dibandingkan dan "Kerja bagus temanku!" Atau "Salah ..." dicetak.

Yang tersisa hanyalah menarik nomor yang tersembunyi dari bingkai tumpukan. Kita sudah tahu ebp nya dari tumpukan panggilan:



Ayo, cepat ...



Sukses! Anda bisa membuka sesuatu yang lezat.

Tetapi tiga hal misterius dibiarkan tanpa penjelasan:
  1. Mengapa ada panggilan untuk Sleep(700) di dalam strcmp() Sleep(700) ?
  2. Mengapa, ketika kami memasukkan nomor tersembunyi, apakah program membeku selama sepuluh detik sebelum mencetak "Kerja bagus, teman saya!"?
  3. Apa yang harus dilakukan oleh pembuat jam dengan puzzle ini?

Jadi, ternyata ada cara kedua - yang lebih cerdas - untuk menebak angka yang ditebak. Jika Anda hanya mencoba secara acak angka 0-9, mudah untuk memperhatikan bahwa pada sembilan program "hang" sedikit. Jika Anda mencoba angka 90-99, Anda dapat melihat bahwa pada nomor 98 program "membeku" dua kali lebih lama. (Setelah menemukan nyali, kami sudah memahami apa masalahnya: perbandingan yang berhasil dari setiap pasangan karakter menyebabkan keterlambatan 0,7 detik.) Untuk menyelesaikan teka-teki tanpa memulai debugger, cukup untuk memilih setiap digit berikutnya sehingga penundaan sebelum jawaban meningkat - baik secara manual dengan stopwatch yang tepat, atau skrip sederhana. Dengan demikian, kompiler mengisyaratkan metode lama menyerang algoritma kriptografi , ketika waktu sampai pesan kesalahan diukur dan dianalisis.

Tetapi untuk belajar mengambil program yang dibungkus dengan crypto-packer yang tidak dikenal, menurut pendapat saya, keduanya lebih menarik dan lebih berharga :-)

Perhatikan bahwa kita tidak perlu mencari tahu bagaimana biner dienkripsi, atau bagaimana string dengan nomor yang Anda lihat muncul di stack (kami melihat di dump bahwa itu bukan di antara konstanta string) - kami berhasil mendapatkan keduanya siap dan siap, dan untuk itu sekitar selusin perintah WinDbg sudah cukup.

Source: https://habr.com/ru/post/id430210/


All Articles