Introduction to x64
Introduction to x64
x64, pia inajulikana kama x86-64, ni usanifu wa processor wa 64-bit unaotumika hasa katika kompyuta za mezani na seva. Unatokana na usanifu wa x86 ulioandaliwa na Intel na baadaye kukubaliwa na AMD kwa jina AMD64, ni usanifu unaotumika sana katika kompyuta binafsi na seva leo.
Registers
x64 inapanua usanifu wa x86, ikiwa na registers 16 za kusudi la jumla zilizo na lebo rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
, na r8
hadi r15
. Kila moja ya hizi inaweza kuhifadhi thamani ya 64-bit (byte 8). Registers hizi pia zina sub-registers za 32-bit, 16-bit, na 8-bit kwa ajili ya ufanisi na kazi maalum.
rax
- Kawaida hutumika kwa thamani za kurudi kutoka kwa kazi.rbx
- Mara nyingi hutumika kama register ya msingi kwa operesheni za kumbukumbu.rcx
- Kawaida hutumika kwa hesabu za mzunguko.rdx
- Hutumika katika majukumu mbalimbali ikiwa ni pamoja na operesheni za hesabu za ziada.rbp
- Pointer ya msingi kwa fremu ya stack.rsp
- Pointer ya stack, ikifuatilia kilele cha stack.rsi
nardi
- Hutumika kwa vigezo vya chanzo na kikundi katika operesheni za nyuzi/kumbukumbu.r8
hadir15
- Registers za ziada za kusudi la jumla zilizoanzishwa katika x64.
Calling Convention
Mkataba wa wito wa x64 unatofautiana kati ya mifumo ya uendeshaji. Kwa mfano:
Windows: Vigezo vinne vya kwanza vinapitishwa katika registers
rcx
,rdx
,r8
, nar9
. Vigezo zaidi vinasukumwa kwenye stack. Thamani ya kurudi iko katikarax
.System V (inayotumika sana katika mifumo kama UNIX): Vigezo sita vya kwanza vya nambari au pointer vinapitishwa katika registers
rdi
,rsi
,rdx
,rcx
,r8
, nar9
. Thamani ya kurudi pia iko katikarax
.
Ikiwa kazi ina zaidi ya ingizo sita, zingine zitapitishwa kwenye stack. RSP, pointer ya stack, inapaswa kuwa imepangwa kwa byte 16, ambayo inamaanisha kwamba anwani inayoelekeza inapaswa kugawanywa kwa 16 kabla ya wito wowote kutokea. Hii inamaanisha kwamba kawaida tunahitaji kuhakikisha kuwa RSP imepangwa ipasavyo katika shellcode yetu kabla ya kufanya wito wa kazi. Hata hivyo, katika mazoezi, wito wa mfumo unafanya kazi mara nyingi hata kama hitaji hili halijakidhi.
Calling Convention in Swift
Swift ina mkataba wa wito wake ambao unaweza kupatikana katika https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64
Common Instructions
Maagizo ya x64 yana seti tajiri, yakihifadhi ufanisi na maagizo ya awali ya x86 na kuanzisha mapya.
mov
: Hamisha thamani kutoka register moja au mahali pa kumbukumbu hadi nyingine.Mfano:
mov rax, rbx
— Hamisha thamani kutokarbx
hadirax
.push
napop
: Sukuma au panda thamani kutoka/kwenda kwenye stack.Mfano:
push rax
— Inasukuma thamani katikarax
kwenye stack.Mfano:
pop rax
— Inapanda thamani ya juu kutoka kwenye stack hadirax
.add
nasub
: Operesheni za kuongeza na kupunguza.Mfano:
add rax, rcx
— Inaongeza thamani katikarax
narcx
ikihifadhi matokeo katikarax
.mul
nadiv
: Operesheni za kuongeza na ugawaji. Kumbuka: hizi zina tabia maalum kuhusu matumizi ya operandi.call
naret
: Inatumika kufanya wito na kurudi kutoka kwa kazi.int
: Inatumika kuanzisha interrupt ya programu. Mfano:int 0x80
ilitumika kwa wito wa mfumo katika 32-bit x86 Linux.cmp
: Linganisha thamani mbili na kuweka bendera za CPU kulingana na matokeo.Mfano:
cmp rax, rdx
— Linganisharax
nardx
.je
,jne
,jl
,jge
, ...: Maagizo ya kuruka kwa masharti yanayobadilisha mtiririko wa udhibiti kulingana na matokeo yacmp
au jaribio la awali.Mfano: Baada ya maagizo ya
cmp rax, rdx
,je label
— Inaruka hadilabel
ikiwarax
ni sawa nardx
.syscall
: Inatumika kwa wito wa mfumo katika mifumo mingine ya x64 (kama Unix za kisasa).sysenter
: Amri ya wito wa mfumo iliyoboreshwa kwenye baadhi ya majukwaa.
Function Prologue
Sukuma pointer ya zamani ya msingi:
push rbp
(huhifadhi pointer ya msingi ya mwitishaji)Hamisha pointer ya sasa ya stack hadi pointer ya msingi:
mov rbp, rsp
(inasanifisha pointer mpya ya msingi kwa kazi ya sasa)Panga nafasi kwenye stack kwa ajili ya vigezo vya ndani:
sub rsp, <size>
(ambapo<size>
ni idadi ya byte zinazohitajika)
Function Epilogue
Hamisha pointer ya sasa ya msingi hadi pointer ya stack:
mov rsp, rbp
(ondoa vigezo vya ndani)Panda pointer ya zamani ya msingi kutoka kwenye stack:
pop rbp
(rejesha pointer ya msingi ya mwitishaji)Rudi:
ret
(rejesha udhibiti kwa mwitishaji)
macOS
syscalls
Kuna makundi tofauti ya syscalls, unaweza kuzipata hapa:
Kisha, unaweza kupata kila nambari ya syscall katika url hii:
Ili kuita syscall open
(5) kutoka Unix/BSD class unahitaji kuiongeza: 0x2000000
Hivyo, nambari ya syscall ya kuita open itakuwa 0x2000005
Shellcodes
Ili kukusanya:
Ili kutoa bytes:
Last updated