macOS .Net Applications Injection
Ovo je sažetak posta https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Pogledajte ga za dalje detalje!
.NET Core Debugiranje
Uspostavljanje debugiranja
Komunikacija između debugera i debugiranog programa u .NET-u se upravlja preko dbgtransportsession.cpp. Ovaj komponenta postavlja dve nazvane cevi po .NET procesu, kako je prikazano u dbgtransportsession.cpp#L127, koje se iniciraju preko twowaypipe.cpp#L27. Ove cevi su sufiksirane sa -in
i -out
.
Posetom korisnikovom $TMPDIR
, mogu se pronaći FIFO-ovi za debugiranje .Net aplikacija.
DbgTransportSession::TransportWorker je odgovoran za upravljanje komunikacijom od debugera. Da bi započeo novu sesiju debugiranja, debugger mora poslati poruku putem out
cevi koja počinje sa MessageHeader
strukturom, detaljno opisanom u izvornom kodu .NET-a:
Da biste zatražili novu sesiju, ova struktura se popunjava na sledeći način, postavljajući tip poruke na MT_SessionRequest
i verziju protokola na trenutnu verziju:
Ova zaglavlje se zatim šalje cilju koristeći write
sistemski poziv, praćeno strukturom sessionRequestData
koja sadrži GUID za sesiju:
Operacija čitanja na out
cevi potvrđuje uspeh ili neuspeh uspostavljanja sesije za debagovanje:
Čitanje memorije
Jednom kada je uspostavljena sesija za debagovanje, memorija se može čitati koristeći tip poruke MT_ReadMemory
. Funkcija readMemory je detaljno opisana, izvodeći neophodne korake za slanje zahteva za čitanje i dobijanje odgovora:
Potpuni dokaz koncepta (POC) dostupan je ovde.
Pisanje u memoriju
Slično tome, memorija se može pisati pomoću funkcije writeMemory
. Postupak uključuje postavljanje tipa poruke na MT_WriteMemory
, navođenje adrese i dužine podataka, a zatim slanje podataka:
Povezani POC je dostupan ovde.
Izvršavanje koda u .NET Core
Da biste izvršili kod, potrebno je identifikovati memorijsku regiju sa dozvolama za čitanje, pisanje i izvršavanje (rwx), što se može uraditi pomoću komande vmmap -pages:
Lociranje mesta za prepisivanje pokazivača funkcije je neophodno, a u .NET Core-u to se može postići ciljanjem Dynamic Function Table (DFT). Ova tabela, detaljno opisana u jithelpers.h
, koristi se od strane izvršnog okruženja za JIT kompilacijske pomoćne funkcije.
Za x64 sisteme, može se koristiti pretraga potpisa kako bi se pronašla referenca na simbol _hlpDynamicFuncTable
u libcorclr.dll
.
Debugger funkcija MT_GetDCB
pruža korisne informacije, uključujući adresu pomoćne funkcije m_helperRemoteStartAddr
, koja ukazuje na lokaciju libcorclr.dll
u memoriji procesa. Ova adresa se zatim koristi za pretragu DFT i prepisivanje pokazivača funkcije sa adresom shell koda.
Ceo POC kod za ubacivanje u PowerShell može se pronaći ovde.
Reference
Last updated