Pemecahan masalah dengan pwnable.kr 03 - bof. Buffer overflow pada stack

gambar

Pada artikel ini, kami akan menganalisis jenis kerentanan seperti buffer overflow pada stack dan menyelesaikan tugas ketiga dari situs pwnable.kr .

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.

Buffer overflow


Buffer overflow adalah kerentanan dalam program komputer berdasarkan pada kemampuan untuk menulis data di luar buffer yang dialokasikan dalam memori, yang biasanya muncul karena penerimaan dan pemrosesan data dari luar yang tidak terkontrol. Penggunaan teknologi bingkai tumpukan tingkat tinggi oleh bahasa mengarah pada pencampuran data kontrol dan data program.

Pada artikel ini, kami hanya menganalisis buffer overflow pada stack. Jenis buffer overflow ini dikenal sebagai Stack smashing dan dapat dieksploitasi dengan cara berikut:

  • menimpa variabel lokal yang terletak di memori dekat buffer;
  • tulis ulang alamat pengirim dalam bingkai tumpukan;
  • menulis ulang pointer fungsi atau pengendali pengecualian;
  • menimpa parameter dari bingkai tumpukan lain.

Tugas ini menggunakan metode penulisan ulang variabel lokal. Pertimbangkan esensinya dalam contoh berikut:

#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; } 

Karena variabel pass didefinisikan sebelumnya, variabel buf , dimungkinkan untuk melimpahnya. Jika Anda memasukkan lebih dari 9 byte dalam buf , mereka akan menimpa data dalam variabel pass . Dengan demikian, dimungkinkan untuk "mengubah" kata sandi Anda sendiri dengan melewati program, misalnya, baris seperti 11111111 \ x0011111111 \ x00 .

gambar

gambar

Solusi dari pekerjaan bof


Kami mengklik ikon dengan tanda tangan bof, dan kami diberi kode sumber, program itu sendiri, serta alamat dan port untuk koneksi TCP.

gambar

Mari kita lihat kode sumbernya.

gambar

Ini mengikuti dari kode bahwa program menerima string, tetapi membandingkan kunci yang sudah kabel dengan nilai kontrol. Tetapi karena input tidak dikontrol, dan kunci ditentukan sebelum buffer kita, kita dapat meluap buffer dan menimpa kunci. Untuk ini, perlu untuk menentukan posisi relatif dari variabel dalam memori.

Saya akan menggunakan Cutter untuk menganalisis program. Buka Cutter, tentukan path ke file yang dapat dieksekusi.

gambar

gambar

gambar

Cutter mengirimkan kami segera ke titik masuk. Dalam daftar fungsi, pilih utama.

gambar

Pada utamanya, kita melihat panggilan ke fungsi kita, membukanya dengan mengklik dua kali pada nama fungsi.

gambar

Ada komentar sebelum kode fungsi, yang mencerminkan variabel yang digunakan dalam fungsi dan alamatnya relatif terhadap basis frame stack saat ini (ebp). Seperti yang dapat Anda tentukan, buffer kami adalah variabel var_2ch , dan kuncinya adalah arg_8h .

gambar

gambar

Kami menghitung berapa byte yang perlu kami timpa. Untuk melakukan ini, cukup cari perbedaan antar alamat.

gambar

Jadi, kita perlu mengirim program 0x34 byte, dan kemudian menambahkan nilai referensi sebagai contoh. Untuk kenyamanan, saya menggunakan pwntools library.

 from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive() 

Kami mendapatkan shell dan melihat bendera.

gambar

Sebagai hasilnya, kami mendapatkan poin kami.

gambar

Pada artikel ini, kami melihat contoh mengeksploitasi buffer overflow pada stack, untuk mengenal alat Cutter dan perpustakaan pwntools. Pada artikel selanjutnya, kita akan berbicara tentang mengemas file yang dapat dieksekusi dan menyelesaikan tugas keempat. Sampai jumpa di artikel berikut.

Kami berada di saluran telegram: saluran di Telegram .

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


All Articles