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, 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.
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
na rdi
- Hutumika kwa vigezo vya chanzo na kikundi katika operesheni za nyuzi/kumbukumbu.
r8
hadi r15
- Registers za ziada za kusudi la jumla zilizoanzishwa katika x64.
Mkataba wa wito wa x64 unatofautiana kati ya mifumo ya uendeshaji. Kwa mfano:
Windows: Vigezo vinne vya kwanza vinapitishwa katika registers rcx
, rdx
, r8
, na r9
. Vigezo zaidi vinasukumwa kwenye stack. Thamani ya kurudi iko katika rax
.
System V (inayotumika sana katika mifumo kama UNIX): Vigezo sita vya kwanza vya nambari au pointer vinapitishwa katika registers rdi
, rsi
, rdx
, rcx
, r8
, na r9
. Thamani ya kurudi pia iko katika rax
.
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.
Swift ina mkataba wa wito wake ambao unaweza kupatikana katika https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64
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 kutoka rbx
hadi rax
.
push
na pop
: Sukuma au panda thamani kutoka/kwenda kwenye stack.
Mfano: push rax
— Inasukuma thamani katika rax
kwenye stack.
Mfano: pop rax
— Inapanda thamani ya juu kutoka kwenye stack hadi rax
.
add
na sub
: Operesheni za kuongeza na kupunguza.
Mfano: add rax, rcx
— Inaongeza thamani katika rax
na rcx
ikihifadhi matokeo katika rax
.
mul
na div
: Operesheni za kuongeza na ugawaji. Kumbuka: hizi zina tabia maalum kuhusu matumizi ya operandi.
call
na ret
: 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
— Linganisha rax
na rdx
.
je
, jne
, jl
, jge
, ...: Maagizo ya kuruka kwa masharti yanayobadilisha mtiririko wa udhibiti kulingana na matokeo ya cmp
au jaribio la awali.
Mfano: Baada ya maagizo ya cmp rax, rdx
, je label
— Inaruka hadi label
ikiwa rax
ni sawa na rdx
.
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.
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)
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)
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
Ili kukusanya:
Ili kutoa bytes:
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)