Introduction to x64
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Introduction to x64
x64, जिसे x86-64 के नाम से भी जाना जाता है, एक 64-बिट प्रोसेसर आर्किटेक्चर है जो मुख्य रूप से डेस्कटॉप और सर्वर कंप्यूटिंग में उपयोग किया जाता है। यह Intel द्वारा निर्मित x86 आर्किटेक्चर से उत्पन्न हुआ और बाद में AMD द्वारा AMD64 नाम से अपनाया गया, यह आज व्यक्तिगत कंप्यूटरों और सर्वरों में प्रचलित आर्किटेक्चर है।
Registers
x64 x86 आर्किटेक्चर का विस्तार करता है, जिसमें 16 सामान्य प्रयोजन रजिस्टर होते हैं जिन्हें rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
, और r8
से r15
तक लेबल किया गया है। इनमें से प्रत्येक 64-बिट (8-बाइट) मान को स्टोर कर सकता है। इन रजिस्टरों में संगतता और विशिष्ट कार्यों के लिए 32-बिट, 16-बिट, और 8-बिट उप-रजिस्टर भी होते हैं।
rax
- पारंपरिक रूप से फंक्शनों से रिटर्न वैल्यू के लिए उपयोग किया जाता है।rbx
- अक्सर मेमोरी ऑपरेशनों के लिए बेस रजिस्टर के रूप में उपयोग किया जाता है।rcx
- सामान्यतः लूप काउंटर के लिए उपयोग किया जाता है।rdx
- विभिन्न भूमिकाओं में उपयोग किया जाता है जिसमें विस्तारित अंकगणितीय संचालन शामिल हैं।rbp
- स्टैक फ्रेम के लिए बेस पॉइंटर।rsp
- स्टैक पॉइंटर, स्टैक के शीर्ष को ट्रैक करता है।rsi
औरrdi
- स्ट्रिंग/मेमोरी ऑपरेशनों में स्रोत और गंतव्य अनुक्रमांक के लिए उपयोग किया जाता है।r8
सेr15
- x64 में पेश किए गए अतिरिक्त सामान्य प्रयोजन रजिस्टर।
Calling Convention
x64 कॉलिंग कन्वेंशन ऑपरेटिंग सिस्टम के बीच भिन्न होता है। उदाहरण के लिए:
Windows: पहले चार पैरामीटर रजिस्टर
rcx
,rdx
,r8
, औरr9
में पास किए जाते हैं। आगे के पैरामीटर स्टैक पर पुश किए जाते हैं। रिटर्न वैल्यूrax
में होती है।System V (जो UNIX-लाइक सिस्टम में सामान्यतः उपयोग किया जाता है): पहले छह पूर्णांक या पॉइंटर पैरामीटर रजिस्टर
rdi
,rsi
,rdx
,rcx
,r8
, औरr9
में पास किए जाते हैं। रिटर्न वैल्यू भीrax
में होती है।
यदि फंक्शन में छह से अधिक इनपुट हैं, तो बाकी स्टैक पर पास किए जाएंगे। RSP, स्टैक पॉइंटर, को 16 बाइट्स संरेखित होना चाहिए, जिसका अर्थ है कि जिस पते की ओर यह इशारा करता है, वह किसी भी कॉल से पहले 16 से विभाज्य होना चाहिए। इसका मतलब है कि सामान्यतः हमें यह सुनिश्चित करने की आवश्यकता होगी कि RSP हमारे शेलकोड में सही ढंग से संरेखित है इससे पहले कि हम एक फंक्शन कॉल करें। हालाँकि, प्रैक्टिस में, सिस्टम कॉल कई बार काम करते हैं भले ही यह आवश्यकता पूरी न हो।
Calling Convention in Swift
Swift की अपनी कॉलिंग कन्वेंशन है जिसे https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64 पर पाया जा सकता है।
Common Instructions
x64 निर्देशों का एक समृद्ध सेट है, जो पहले के x86 निर्देशों के साथ संगतता बनाए रखता है और नए निर्देशों को पेश करता है।
mov
: एक रजिस्टर या मेमोरी स्थान से दूसरे में एक मान स्थानांतरित करें।उदाहरण:
mov rax, rbx
—rbx
सेrax
में मान स्थानांतरित करता है।push
औरpop
: स्टैक पर मानों को पुश या पॉप करें।उदाहरण:
push rax
—rax
में मान को स्टैक पर पुश करता है।उदाहरण:
pop rax
— स्टैक से शीर्ष मान कोrax
में पॉप करता है।add
औरsub
: जोड़ और घटाव संचालन।उदाहरण:
add rax, rcx
—rax
औरrcx
में मानों को जोड़ता है और परिणाम कोrax
में स्टोर करता है।mul
औरdiv
: गुणा और भाग संचालन। नोट: इनका ऑपरेटर उपयोग के संबंध में विशिष्ट व्यवहार होता है।call
औरret
: फंक्शनों को कॉल और रिटर्न करने के लिए उपयोग किया जाता है।int
: एक सॉफ़्टवेयर इंटरप्ट को ट्रिगर करने के लिए उपयोग किया जाता है। उदाहरण:int 0x80
32-बिट x86 Linux में सिस्टम कॉल के लिए उपयोग किया गया था।cmp
: दो मानों की तुलना करें और परिणाम के आधार पर CPU के फ्लैग सेट करें।उदाहरण:
cmp rax, rdx
—rax
की तुलनाrdx
से करता है।je
,jne
,jl
,jge
, ...: संविधानात्मक कूद निर्देश जो पिछलेcmp
या परीक्षण के परिणामों के आधार पर नियंत्रण प्रवाह को बदलते हैं।उदाहरण:
cmp rax, rdx
निर्देश के बाद,je label
— यदिrax
rdx
के बराबर है तोlabel
पर कूदता है।syscall
: कुछ x64 सिस्टम (जैसे आधुनिक Unix) में सिस्टम कॉल के लिए उपयोग किया जाता है।sysenter
: कुछ प्लेटफार्मों पर एक अनुकूलित सिस्टम कॉल निर्देश।
Function Prologue
पुराने बेस पॉइंटर को पुश करें:
push rbp
(कॉलर के बेस पॉइंटर को सहेजता है)वर्तमान स्टैक पॉइंटर को बेस पॉइंटर में स्थानांतरित करें:
mov rbp, rsp
(वर्तमान फंक्शन के लिए नए बेस पॉइंटर को सेट करता है)स्थानीय चर के लिए स्टैक पर स्थान आवंटित करें:
sub rsp, <size>
(जहाँ<size>
आवश्यक बाइट्स की संख्या है)
Function Epilogue
वर्तमान बेस पॉइंटर को स्टैक पॉइंटर में स्थानांतरित करें:
mov rsp, rbp
(स्थानीय चर को डिअलॉकेट करें)स्टैक से पुराने बेस पॉइंटर को पॉप करें:
pop rbp
(कॉलर के बेस पॉइंटर को पुनर्स्थापित करता है)रिटर्न करें:
ret
(कॉलर को नियंत्रण लौटाता है)
macOS
syscalls
syscalls की विभिन्न श्रेणियाँ हैं, आप यहाँ उन्हें खोज सकते हैं:
फिर, आप प्रत्येक syscall संख्या इस URL में: खोज सकते हैं:
इसलिए Unix/BSD वर्ग से open
syscall (5) को कॉल करने के लिए आपको इसे जोड़ना होगा: 0x2000000
तो, open
को कॉल करने के लिए syscall संख्या होगी 0x2000005
Shellcodes
संकलन करने के लिए:
बाइट्स निकालने के लिए:
Last updated