Pemecahan masalah dengan pwnable.kr 24 - login sederhana. Hamparan bingkai tumpukan

gambar

Pada artikel ini, kita akan menyelesaikan tugas ke-24 dari situs pwnable.kr dan belajar tentang menumpuk bingkai tumpukan.

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.

Solusi pekerjaan login sederhana


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 tanda masuk sederhana 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

Dalam program ini, data pengguna diterjemahkan dari base64. Variabel v7 menyimpan panjang string yang diterjemahkan. Selanjutnya, v7 dibandingkan dengan 12. Jika tes dilewatkan, string yang didekodekan disalin ke variabel input, dan kemudian fungsi auth dipanggil, ke mana panjang string yang didekodekan dilewatkan sebagai parameter. Dan jika kita melewati otentikasi, fungsi yang benar dipanggil. Mari kita lihat fungsi auth.

gambar

Sepertinya buffer overflow. Lihatlah tumpukan itu.

gambar

Tidak. Kami tidak dapat meluap buffer, karena ini membutuhkan lebih dari 12 byte. Alamat tempat nilai variabel disimpan menarik, terutama variabel v4 yang melakukan penyalinan.

gambar

Ini adalah alamat [ESP + 32]. Lihatlah kode untuk ini dalam bentuk dibongkar.

gambar

Instruksi berikut diperlukan untuk menyimpan bingkai tumpukan.
push ebp
mov ebp, esp

Untuk mengembalikan tumpukan, gunakan pernyataan cuti. Yang kami lakukan operasi terbalik.

gambar

Yang paling menarik adalah instruksi ketiga sub esp, 28h .

Jadi, tumpang tindih terjadi: esp berkurang sebesar 40, dan variabel v2 terletak di esp + 32 dan membutuhkan 12 byte. Yaitu, setelah memindahkan nilai dari esp ke ebp, alamat empat byte terakhir dari variabel v2 akan disimpan dalam ebp. Ketika instruksi meninggalkan dan retn dieksekusi, empat byte terakhir dari variabel v2 sekarang akan berada di bingkai tinggi stack.

Mari kita periksa dan berikan baris input QUFBQUFBQUFCQkJC.

gambar

Jika asumsi kami benar, maka setelah menjalankan retn dalam fungsi auth, bagian atas tumpukan akan menjadi alamat "BBBB".

gambar

Sekarang jalankan cuti.

gambar

Ada "BBBB" di EBP dan sekarang setelah mengeksekusi cuti di fungsi utama, program akan macet. Dengan demikian, kita bisa di depan alamat bagian atas tumpukan di mana alamat yang ingin kita tuju akan ditemukan. Maka bebannya akan seperti ini: 4 byte + alamat di mana kita pergi + alamat ke awal beban.

Pertama, tulis templat.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() r.interactive() 

Sekarang kita mencari tahu alamat yang ingin kita tuju - ini adalah 0x8049284 di dalam fungsi yang benar.

gambar

Alamat ini akan menjadi bagian kedua dari beban kami. Bagian ketiga dari beban akan menjadi alamat variabel input (alamat beban).

gambar

Kami menyusun beban dalam kode. Jangan lupa untuk menyandikan di base64:
 payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) 

Kode lengkap.
 from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) r.send(payload+"\n") r.interactive() 

gambar

Dan dapatkan poin Anda. Jujur saja, tugas ini tidak mudah bagi saya.

gambar

Dan kami melanjutkan: di artikel berikutnya - forensik. Anda dapat bergabung dengan kami di Telegram .

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


All Articles