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, जिसे x86-64 के नाम से भी जाना जाता है, एक 64-बिट प्रोसेसर आर्किटेक्चर है जो मुख्य रूप से डेस्कटॉप और सर्वर कंप्यूटिंग में उपयोग किया जाता है। यह Intel द्वारा निर्मित x86 आर्किटेक्चर से उत्पन्न हुआ और बाद में AMD द्वारा AMD64 नाम से अपनाया गया, यह आज व्यक्तिगत कंप्यूटरों और सर्वरों में प्रचलित आर्किटेक्चर है।
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 में पेश किए गए अतिरिक्त सामान्य प्रयोजन रजिस्टर।
x64 कॉलिंग कन्वेंशन ऑपरेटिंग सिस्टम के बीच भिन्न होता है। उदाहरण के लिए:
Windows: पहले चार पैरामीटर रजिस्टर rcx
, rdx
, r8
, और r9
में पास किए जाते हैं। आगे के पैरामीटर स्टैक पर पुश किए जाते हैं। रिटर्न मान rax
में होता है।
System V (जो UNIX-लाइक सिस्टम में सामान्यतः उपयोग किया जाता है): पहले छह पूर्णांक या पॉइंटर पैरामीटर रजिस्टर rdi
, rsi
, rdx
, rcx
, r8
, और r9
में पास किए जाते हैं। रिटर्न मान भी rax
में होता है।
यदि फंक्शन में छह से अधिक इनपुट हैं, तो बाकी स्टैक पर पास किए जाएंगे। RSP, स्टैक पॉइंटर, को 16 बाइट्स संरेखित होना चाहिए, जिसका अर्थ है कि जिस पते की ओर यह इशारा करता है, वह किसी भी कॉल से पहले 16 से विभाज्य होना चाहिए। इसका मतलब है कि सामान्यतः हमें यह सुनिश्चित करने की आवश्यकता होगी कि RSP हमारे शेलकोड में सही ढंग से संरेखित है इससे पहले कि हम एक फंक्शन कॉल करें। हालाँकि, प्रैक्टिस में, सिस्टम कॉल कई बार काम करते हैं भले ही यह आवश्यकता पूरी न हो।
Swift की अपनी कॉलिंग कन्वेंशन है जिसे https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64 पर पाया जा सकता है।
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
: कुछ प्लेटफार्मों पर एक अनुकूलित सिस्टम कॉल निर्देश।
पुराने बेस पॉइंटर को पुश करें: push rbp
(कॉलर के बेस पॉइंटर को सहेजता है)
वर्तमान स्टैक पॉइंटर को बेस पॉइंटर में स्थानांतरित करें: mov rbp, rsp
(वर्तमान फंक्शन के लिए नए बेस पॉइंटर को सेट करता है)
स्थानीय चर के लिए स्टैक पर स्थान आवंटित करें: sub rsp, <size>
(जहाँ <size>
आवश्यक बाइट्स की संख्या है)
वर्तमान बेस पॉइंटर को स्टैक पॉइंटर में स्थानांतरित करें: mov rsp, rbp
(स्थानीय चर को डिएक्लेट करता है)
स्टैक से पुराने बेस पॉइंटर को पॉप करें: pop rbp
(कॉलर के बेस पॉइंटर को पुनर्स्थापित करता है)
रिटर्न करें: ret
(कॉलर को नियंत्रण लौटाता है)
syscalls की विभिन्न श्रेणियाँ हैं, आप यहाँ उन्हें खोज सकते हैं:
फिर, आप प्रत्येक syscall संख्या इस URL में: खोज सकते हैं:
इसलिए Unix/BSD वर्ग से open
syscall (5) को कॉल करने के लिए आपको इसे जोड़ना होगा: 0x2000000
तो, open
को कॉल करने के लिए syscall संख्या होगी 0x2000005
संकलन करने के लिए:
बाइट्स निकालने के लिए:
सीखें और AWS हैकिंग का अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) सीखें और GCP हैकिंग का अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)