Pada artikel ini, kami akan menganalisis jenis kerentanan seperti buffer overflow pada stack dan menyelesaikan tugas ketiga dari situs
pwnable.kr .
Informasi OrganisasiTerutama 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 .


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.

Mari kita lihat kode sumbernya.

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.



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

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

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 .


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

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.

Sebagai hasilnya, kami mendapatkan poin kami.

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 .