Pada artikel ini kita akan membahas tentang penyelarasan data, dan juga menyelesaikan tugas ke 17 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.
Penyelarasan data
Menyelaraskan data dalam memori akses acak komputer adalah pengaturan khusus data dalam memori untuk akses yang lebih cepat. Saat bekerja dengan memori, proses menggunakan kata mesin sebagai unit utama. Berbagai jenis prosesor dapat memiliki ukuran yang berbeda: satu, dua, empat, delapan, dll. byte. Saat menyimpan objek dalam memori, mungkin terjadi beberapa bidang yang melampaui batas kata ini. Beberapa prosesor dapat bekerja dengan data yang tidak selaras untuk waktu yang lebih lama daripada dengan data yang selaras. Dan prosesor yang tidak canggih umumnya tidak dapat bekerja dengan data yang tidak selaras.
Untuk lebih membayangkan model data yang selaras dan tidak selaras, pertimbangkan contoh pada objek berikut - struktur Data.
struct Data{ int var1; void* mas[4]; };
Karena ukuran variabel int dalam prosesor x32 dan x64 tidak 4 byte, dan nilai variabel void * masing-masing adalah 4 dan 8 byte, struktur untuk prosesor x32 dan x64 ini akan ditampilkan dalam memori sebagai berikut.

Prosesor X64 dengan struktur seperti itu tidak akan berfungsi, karena data tidak selaras. Untuk penyelarasan data perlu menambahkan bidang 4 byte lain ke struktur.
struct Data{ int var1; int addition; void* mas[4]; };
Dengan demikian, data struktur data untuk prosesor x64 akan disejajarkan dalam memori.

Solusi pekerjaan memcpy
Kami mengklik ikon tanda tangan memcpy dan kami diberitahu bahwa kami harus terhubung melalui SSH dengan tamu kata sandi.
Mereka juga menyediakan kode sumber. 
Saat terhubung, kami melihat spanduk yang sesuai.

Mari cari tahu file apa yang ada di server, serta hak apa yang kita miliki.

Kami memiliki file readme. Setelah membacanya, kita mengetahui bahwa program berjalan pada port 9022.

Terhubung ke port 9022. Kami ditawari percobaan - bandingkan versi memcpy yang lambat dan cepat. Kemudian program akan memasukkan angka dalam interval tertentu dan mengeluarkan laporan tentang membandingkan versi fungsi yang lambat dan cepat. Ada satu hal: percobaan 10, dan laporan - 5.

Mari kita bereskan alasannya. Temukan tempat dalam kode untuk membandingkan hasilnya.

Semuanya sederhana, slow_memcpy pertama dipanggil, lalu fast_memcpy. Tetapi dalam laporan program ada kesimpulan tentang pelepasan fungsi yang lambat, dan ketika implementasi cepat dipanggil, program macet. Mari kita lihat kode implementasi cepat.

Menyalin dilakukan dengan menggunakan fungsi assembler. Kami menentukan dengan perintah bahwa ini adalah SSE2. Seperti yang dikatakan di
sini : SSE2 menggunakan delapan register 128-bit (xmm0 hingga xmm7) yang termasuk dalam arsitektur x86 dengan pengenalan ekstensi SSE, masing-masing diperlakukan sebagai 2 nilai floating-point presisi ganda berurutan. Selain itu, kode ini berfungsi dengan data yang selaras.


Dengan demikian, bekerja dengan data yang tidak selaras, program mungkin macet. Alignment dilakukan oleh 128 bit, yaitu masing-masing 16 byte, yang berarti blok harus sama dengan 16. Kita perlu mengetahui berapa banyak byte yang sudah ada di blok pertama pada heap (misalkan X) maka kita masing-masing harus mentransfer program sebanyak byte (biarkan Y) sehingga ( X + Y)% 16 adalah 0.
Karena semua operasi menempati heap blok yang merupakan kelipatan dari dua, beralih lebih dari X sebagai 2, 4, 8, dll sampai 16.


Seperti yang Anda lihat, dengan X = 4, program berjalan dengan sukses.

Kami mendapatkan shell, membaca bendera, mendapatkan 10 poin.

Anda dapat bergabung dengan kami di
Telegram . Lain kali kita akan berurusan dengan heap overflow.