Saya memecahkan tantangan eksploitasi biner di picoCTF dan menemukan potongan kode ini:
((void (*)())buf)();
dimana buf
array karakter.
Saya memecahkan tantangan tetapi tampaknya tidak mengerti apa yang sebenarnya ia lakukan. Saya melihat ini utas tetapi saya tidak bisa keluar.
Apa ((void (*)())buf)();
artinya
c
function
pointers
function-pointers
sh.3.ll
sumber
sumber
((void (*)())buf)();
artinya Artinya penulis tidak mengertitypedef
.typedef void (*voidFuncPtrType)();
akan membuat kode ini jelas.Jawaban:
void (*)()
adalah tipe, tipenya adalah "pointer ke fungsi yang mengambil argumen tak tentu dan tidak mengembalikan nilai".(void (*)())
adalah tipe-cast untuk tipe di atas.(void (*)())buf
gipsbuf
ke jenis di atas.((void (*)())buf)()
memanggil fungsi (tanpa argumen).Singkatnya: Ini memberitahu kompiler untuk memperlakukan
buf
sebagai pointer ke suatu fungsi, dan memanggil fungsi itu.sumber
cdecl
utilitas (atau situs web ) bermanfaat untuk menerjemahkan ekspresi C yang lebih kompleks ke dalam bahasa Inggris.buf
ataucopy
berada di alamat yang dapat dieksekusi dan kode itu sendiri adalah posisi-independen, ini akan berfungsi. Ini tentu saja sebagai non-portabel karena mendapat, tetapi ini harus bekerja di banyak lingkungan bare-metal serta OS x86 yang lebih tua yang tidak mengatur bit no-execute (NX) pada stack dan heap.pointer
buf
dikonversi ke fungsi pointer untuk membatalkan mengambil jumlah parameter yang tidak ditentukan dan kemudian dereferenced (yaitu fungsi yang disebut).sumber
Ini adalah typecast, diikuti oleh pemanggilan fungsi. Pertama,
buf
dilemparkan ke pointer ke fungsi yang mengembalikanvoid
. Pasangan kurung terakhir berarti bahwa fungsi tersebut kemudian dipanggil.sumber
Itu melemparkan array karakter ke pointer ke fungsi tanpa argumen dan kembali
void
, dan kemudian memanggilnya. Dereferencing pointer tidak diperlukan karena cara kerja pointer fungsi.Sebuah penjelasan:
"Larik karakter" itu sebenarnya adalah larik kode mesin. Ketika Anda melemparkan array ke
void (*)()
dan memanggilnya, itu menjalankan kode mesin di dalam array. Jika Anda memberikan konten array, saya bisa membukanya untuk Anda dan memberi tahu Anda apa yang dilakukannya.sumber