Introduction to x64
x64'ün Tanıtımı
x64, aynı zamanda x86-64 olarak da bilinir, masaüstü ve sunucu bilgisayarlarında yaygın olarak kullanılan 64-bit işlemci mimarisidir. Intel tarafından üretilen x86 mimarisinden türemiş ve daha sonra AMD tarafından AMD64 adıyla benimsenmiştir, bugün kişisel bilgisayarlarda ve sunucularda yaygın olarak kullanılan mimaridir.
Registerlar
x64, x86 mimarisini genişleterek 16 genel amaçlı register içerir: rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
ve r8
ile r15
. Her biri 64-bit (8-byte) bir değer saklayabilir. Bu registerlar uyumluluk ve belirli görevler için 32-bit, 16-bit ve 8-bit alt-registerlara sahiptir.
rax
- Genellikle fonksiyonlardan dönüş değerleri için kullanılır.rbx
- Bellek işlemleri için genellikle bir baz register olarak kullanılır.rcx
- Genellikle döngü sayıcıları için kullanılır.rdx
- Genişletilmiş aritmetik işlemler de dahil olmak üzere çeşitli rollerde kullanılır.rbp
- Yığın çerçevesi için baz işaretçisi.rsp
- Yığının en üstünü takip eden yığın işaretçisi.rsi
verdi
- Dize/bellek işlemlerinde kaynak ve hedef dizinleri için kullanılır.r8
iler15
- x64'te tanıtılan ek genel amaçlı registerlar.
Çağrı Sözleşmesi
x64 çağrı sözleşmesi işletim sistemlerine göre değişir. Örneğin:
Windows: İlk dört parametre,
rcx
,rdx
,r8
ver9
registerlarına iletilir. Daha fazla parametre yığına itilir. Dönüş değerirax
registerındadır.System V (genellikle UNIX benzeri sistemlerde kullanılır): İlk altı tamsayı veya işaretçi parametreleri,
rdi
,rsi
,rdx
,rcx
,r8
ver9
registerlarına iletilir. Dönüş değeri derax
registerındadır.
Eğer fonksiyonun altıdan fazla girişi varsa, geri kalanlar yığına iletilir. RSP, yığın işaretçisi, 16 byte hizalanmış olmalıdır, yani herhangi bir çağrıdan önce işaret ettiği adresin 16'ya bölünebilir olması gerekir. Bu normalde, bir fonksiyon çağrısından önce shellcode'umuzda RSP'nin uygun şekilde hizalandığından emin olmamız gerektiği anlamına gelir. Ancak uygulamada, sistem çağrıları bu gereksinimi karşılamadığında bile birçok kez çalışır.
Swift'te Çağrı Sözleşmesi
Swift'in kendi çağrı sözleşmesi burada bulunabilir
Yaygın Komutlar
x64 komutları, önceki x86 komutlarıyla uyumluluğu korurken yeni komutlar da tanıtır.
mov
: Bir değeri başka bir register veya bellek konumuna taşır.Örnek:
mov rax, rbx
—rbx
'denrax
'e değeri taşır.push
vepop
: Değerleri yığına itme veya yığından çekme.Örnek:
push rax
—rax
'teki değeri yığına iter.Örnek:
pop rax
— Yığının en üstündeki değerirax
'e çeker.add
vesub
: Toplama ve çıkarma işlemleri.Örnek:
add rax, rcx
—rax
vercx
'teki değerleri toplar ve sonucurax
'e saklar.mul
vediv
: Çarpma ve bölme işlemleri. Not: Bu işlemler operand kullanımı açısından belirli davranışlara sahiptir.call
veret
: Fonksiyonları çağırmak ve dönmek için kullanılır.int
: Yazılım kesmesi tetiklemek için kullanılır. Örn., 32-bit x86 Linux'ta sistem çağrıları içinint 0x80
kullanılmıştır.cmp
: İki değeri karşılaştırır ve CPU'nun bayraklarını sonuca göre ayarlar.Örnek:
cmp rax, rdx
—rax
'irdx
ile karşılaştırır.je
,jne
,jl
,jge
, ...: Önceki bircmp
veya testin sonuçlarına göre kontrol akışını değiştiren koşullu atlama komutları.Örnek:
cmp rax, rdx
talimatından sonra,je label
—rax
rdx
'e eşitselabel
'e atlar.syscall
: Bazı x64 sistemlerinde (modern Unix gibi) sistem çağrıları için kullanılır.sysenter
: Bazı platformlarda optimize edilmiş bir sistem çağrısı talimatı.
Fonksiyon Prologu
Eski baz işaretçisini yığına itme:
push rbp
(çağrıcının baz işaretçisini kaydeder)Mevcut yığın işaretçisini baz işaretçisine taşıma:
mov rbp, rsp
(geçerli işlev için yeni baz işaretçisini ayarlar)Yerel değişkenler için yığında alan ayırma:
sub rsp, <boyut>
( ihtiyaç duyulan bayt sayısıdır)
Fonksiyon Epilogu
Mevcut baz işaretçisini yığın işaretçisine taşıma:
mov rsp, rbp
(yerel değişkenleri serbest bırakır)Eski baz işaretçisini yığından çıkarma:
pop rbp
(çağrıcının baz işaretçisini geri yükler)Dönüş:
ret
(kontrolü çağırıcıya geri döndürür)
macOS
sistem çağrıları
Farklı sistem çağrıları sınıfları bulunmaktadır, bunları burada bulabilirsiniz:
Sonra, her sistem çağrısı numarasını bu URL'de** bulabilirsiniz:**
Yani open
sistem çağrısını (5) Unix/BSD sınıfından çağırmak için eklemeniz gereken şey: 0x2000000
Yani, open çağrısını yapmak için sistem çağrı numarası 0x2000005
olacaktır
Kabuk Kodları
Derlemek için:
Baytları çıkarmak için:
Last updated