Introduction to x64
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
x64, ayrıca x86-64 olarak bilinir, esas olarak masaüstü ve sunucu bilgisayarlarında kullanılan 64-bit bir işlemci mimarisidir. Intel tarafından üretilen x86 mimarisinden türetilmiş ve daha sonra AMD tarafından AMD64 adıyla benimsenmiştir; günümüzde kişisel bilgisayarlarda ve sunucularda yaygın olarak kullanılan mimaridir.
x64, x86 mimarisini genişleterek 16 genel amaçlı kayıt sunar; bunlar rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
ve r8
ile r15
olarak etiketlenmiştir. Her biri 64-bit (8-byte) bir değeri saklayabilir. Bu kayıtlar ayrıca uyumluluk ve belirli görevler için 32-bit, 16-bit ve 8-bit alt kayıtlar içerir.
rax
- Geleneksel olarak fonksiyonlardan dönen değerler için kullanılır.
rbx
- Genellikle bellek işlemleri için bir temel kayıt olarak kullanılır.
rcx
- Sıklıkla döngü sayacı olarak kullanılır.
rdx
- Uzatılmış aritmetik işlemler de dahil olmak üzere çeşitli rollerde kullanılır.
rbp
- Yığın çerçevesi için temel işaretçi.
rsp
- Yığın işaretçisi, yığının en üstünü takip eder.
rsi
ve rdi
- Dize/bellek işlemlerinde kaynak ve hedef indeksleri için kullanılır.
r8
ile r15
- x64'te tanıtılan ek genel amaçlı kayıtlardır.
x64 çağrı konvansiyonu işletim sistemlerine göre değişir. Örneğin:
Windows: İlk dört parametre rcx
, rdx
, r8
ve r9
kayıtlarında geçilir. Diğer parametreler yığına itilir. Dönen değer rax
içindedir.
System V (genellikle UNIX benzeri sistemlerde kullanılır): İlk altı tamsayı veya işaretçi parametre rdi
, rsi
, rdx
, rcx
, r8
ve r9
kayıtlarında geçilir. Dönen değer de rax
içindedir.
Fonksiyonun altıdan fazla girişi varsa, geri kalan yığında geçilecektir. RSP, yığın işaretçisi, 16 byte hizalanmış olmalıdır; bu, işaret ettiği adresin herhangi bir çağrıdan önce 16'ya tam bölünebilir olması gerektiği anlamına gelir. Bu, genellikle bir fonksiyon çağrısı yapmadan önce RSP'nin düzgün bir şekilde hizalandığından emin olmamız gerektiği anlamına gelir. Ancak pratikte, sistem çağrıları bu gereklilik karşılanmadığında bile birçok kez çalışır.
Swift'in kendi çağrı konvansiyonu vardır, burada bulabilirsiniz
x64 talimatları, önceki x86 talimatlarıyla uyumluluğu koruyarak ve yenilerini tanıtarak zengin bir set sunar.
mov
: Bir değeri bir kayıttan veya bellek konumundan diğerine taşır.
Örnek: mov rax, rbx
— rbx
'teki değeri rax
'e taşır.
push
ve pop
: Değerleri yığına itme veya yığından alma.
Örnek: push rax
— rax
'teki değeri yığına iter.
Örnek: pop rax
— Yığından en üstteki değeri rax
'e alır.
add
ve sub
: Toplama ve çıkarma işlemleri.
Örnek: add rax, rcx
— rax
ve rcx
'teki değerleri toplar ve sonucu rax
'te saklar.
mul
ve div
: Çarpma ve bölme işlemleri. Not: Bunların operand kullanımıyla ilgili belirli davranışları vardır.
call
ve ret
: Fonksiyonları çağırmak ve geri dönmek için kullanılır.
int
: Yazılım kesintisi tetiklemek için kullanılır. Örneğin, int 0x80
32-bit x86 Linux'ta sistem çağrıları için kullanılmıştır.
cmp
: İki değeri karşılaştırır ve sonuca göre CPU'nun bayraklarını ayarlar.
Örnek: cmp rax, rdx
— rax
'ı rdx
ile karşılaştırır.
je
, jne
, jl
, jge
, ...: Önceki bir cmp
veya testin sonuçlarına göre kontrol akışını değiştiren koşullu atlama talimatları.
Örnek: cmp rax, rdx
talimatından sonra, je label
— rax
rdx
'e eşitse label
'e atlar.
syscall
: Bazı x64 sistemlerde (modern Unix gibi) sistem çağrıları için kullanılır.
sysenter
: Bazı platformlarda optimize edilmiş bir sistem çağrısı talimatıdır.
Eski temel işaretçiyi it: push rbp
(çağıranın temel işaretçisini kaydeder)
Mevcut yığın işaretçisini temel işaretçiye taşı: mov rbp, rsp
(mevcut fonksiyon için yeni temel işaretçiyi ayarlar)
Yerel değişkenler için yığında alan ayır: sub rsp, <size>
(burada <size>
, gereken byte sayısıdır)
Mevcut temel işaretçiyi yığın işaretçisine taşı: mov rsp, rbp
(yerel değişkenleri serbest bırak)
Eski temel işaretçiyi yığından al: pop rbp
(çağıranın temel işaretçisini geri yükler)
Dön: ret
(kontrolü çağırana geri verir)
Farklı syscall sınıfları vardır, burada bulabilirsiniz:
Sonra, her syscall numarasını bu URL'de: bulabilirsiniz.
Bu nedenle, Unix/BSD sınıfından open
syscall'ını (5) çağırmak için şunu eklemeniz gerekir: 0x2000000
Yani, open'ı çağırmak için syscall numarası 0x2000005
olacaktır.
Derlemek için:
Baytları çıkarmak için:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)