Ta witryna korzysta z plików cookies. Korzystając z witryny akceptujesz: polityka prywatności.   [×]
Online: 0x0B (11)

haker.info – Etyczny hacking🕊️

Spreading knowledge like a virus.

Wymazywanie kodu z pamięci (x64)

🕰 ✒️ Dawid Farbaniec 📄 620 słów

0x01. Słowem wstępu

Możliwym jest, że w pewnym tworzonym programie nadejdzie potrzeba wymazania określonych danych czy nawet kodu. I nie chodzi tutaj o pisanie złośliwego oprogramowania. Chociaż technika wymazywania kodu z pamięci może niektórym Czytelnikom wydawać się podejrzana (Viral behaviour! o_O — przyp. Mr. At). Przejdźmy jednak do konkretów bez smęcenia czy technika zostanie zastosowana do wymazania shellcode w ładunku na potrzeby testu bezpieczeństwa czy w innym celu.

0x02. Model pamięci „płaski” (ang. flat)

Cytat z książki Asembler x64. Laboratorium (ISBN: 9788382457032) mojego autorstwa:

Dawne aplikacje dla podsystemu MS-DOS w architekturze 16-bitowej korzystały z segmentowego modelu pamięci (ang. segmented memory model). Aby dostać się wtedy do określonego miejsca w pamięci należało podać selektor segmentu, a następnie przesunięcie. Powodem tego było podzielenie pamięci na osobne obszary. Takie jak np. segment kodu czy danych. W architekturze 32-bitowej (x86) oraz 64-bitowej (x86—64) korzysta się z modelu płaskiego (ang. flat memory model). Pamięć tutaj wygląjak ciągła przestrzeń, a odwołanie do określonego miejsca wykonuje się poprzez podanie adresu liniowego nazywanego też efektywnym.


image
Rysunek: Model pamięci „płaski” (ang. flat) – schemat

0x03. PVOID SecureZeroMemory(...);

Jeśli programiście zależy, aby dane nie pozostały w pamięci, to w aplikacjach natywnych dla systemu Windows (Co to Win32 API, Native API, WinRT?) możliwe jest skorzystanie np. z funkcji SecureZeroMemory. Dokumentacja pod adresem https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366877(v=vs.85) [dostęp: 19.07.2021 r.] zawiera nawet przykład, gdzie po wczytaniu hasła od użytkownika i użyciu jest ono wymazywane z pamięci.

WCHAR szPassword[MAX_PATH]; // Retrieve the password if (GetPasswordFromUser(szPassword, MAX_PATH)) UsePassword(szPassword); // Clear the password from memory SecureZeroMemory(szPassword, sizeof(szPassword));

Źródło: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366877(v=vs.85) [dostęp: 19.07.2021 r.]

Podobnym mechanizmem jest SecureString w C#/.NET. Ostatecznie jednak tego typu podejścia NIE SĄ ZALECANE. Należy użyć innych sposobów autoryzacji (https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md [dostęp: 19.07.2021 r.]).

Don't use SecureString for new code. When porting code to .NET Core, consider that the contents of the array are not encrypted in memory. The general approach of dealing with credentials is to avoid them and instead rely on other means to authenticate, such as certificates or Windows authentication.
Źródło: https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md [dostęp: 19.07.2021 r.]

0x04. Wymazanie kodu funkcji po wywołaniu (MASM x64)

Wskazówka: Co to jest kod maszynowy?

Wymazanie kodu z pamięci jest trochę bardziej złożone niż wymazanie danych (zmiennej). Przykład w Asemblerze MASM x64 przedstawiono na listingu poniżej. Wypełnienie wnętrza funkcji pustymi instrukcjami NOP (ang. no operation) jest możliwe dzięki pobraniu początku i końca bloku kodu za pomocą etykiet oraz rozmiaru kodu w bajtach. Prawa do zapisu w sekcji kodu są uzyskiwane poprzez funkcję VirtualProtect.


;+-----------------------------------------+ ;| Erase procedure body code in MASM x64 | ;| Code example by https://haker.info/ | ;+-----------------------------------------+ extrn MessageBoxA : proc extrn VirtualProtect : proc .const PAGE_EXECUTE_READWRITE equ 040h ProcInfo struct bodyStart dq 0 bodyEnd dq 0 bodySize dq 0 ProcInfo ends .data szCaption db "haker.info", 0 szText db "This is sample procedure call.", 0 oldProtect dd 0 procInfo1 ProcInfo <0,0,0> .code MyProc1 proc mov rax, offset _ERASE_START mov [procInfo1.BodyStart], rax push rbp mov rbp, rsp _ERASE_START: sub rsp, 30h xor r9, r9 lea r8, szCaption lea rdx, szText xor rcx, rcx call MessageBoxA add rsp, 30h _ERASE_END: leave mov rcx, offset _ERASE_END dec rcx mov [procInfo1.bodyEnd], rcx sub rcx, qword ptr [procInfo1.BodyStart] mov [procInfo1.bodySize], rcx ret MyProc1 endp Main proc ;sample procedure call sub rsp, 28h call MyProc1 add rsp, 28h ;get write access to code block sub rsp, 28h mov r9, offset oldProtect mov r8, PAGE_EXECUTE_READWRITE mov rdx, [procInfo1.bodySize] mov rcx, qword ptr [procInfo1.BodyStart] call VirtualProtect add rsp, 28h ;erase procedure body (fill with NOPs) mov rdx, [procInfo1.BodyStart] xor rcx, rcx _loop1: mov byte ptr [rdx + rcx * sizeof byte], 90h inc rcx cmp rcx, [procInfo1.bodySize] jle _loop1 ;sample procedure call (after erasing) sub rsp, 28h call MyProc1 add rsp, 28h ret Main endp end

Działanie kodu wymazującego wnętrze funkcji przedstawia rysunek poniżej.

image
Rysunek: Wymazywanie kodu z pamięci – widok z debuggera x64dbg

0x05. Zakończenie

Dziękuję za czas poświęcony na przeczytanie tego wpisu.

Wykaz literatury (bibliografia)

[1] Dawid Farbaniec, 2021 – Asembler x64. Laboratorium, ISBN: 9788382457032
[2] Advanced Micro Devices Inc., 2017 – AMD64 Architecture Programmer's Manual
[3] Intel Corporation, 2019 – Intel 64 and IA-32 Architectures Software Developer's Manual


Komentarze czytelników

📖 Trzymaj e-booka! 👋🏻

\\ więcej książek i e-booków »

Komentarze [0]

jas napisał komentarz do ↴
🔳 Dekodowanie kodu Aztec 2D z dowodu rejestracyjnego
[🕰 / 🌎 IP address logged ]
jas napisał komentarz do ↴
🔳 Mowa szesnastkowa (ang. hex speech)
[🕰 / 🌎 IP address logged ]
Iceman napisał komentarz do ↴
🔳 Mowa szesnastkowa (ang. hex speech)
[🕰 / 🌎 IP address logged ]

🎲 Losowe wpisy

Hacking i wartości moralne – przemyślenia (780 słów) Przeczytaj teraz »
Wymazywanie kodu z pamięci (x64) (620 słów) Przeczytaj teraz »
Gry typu Roguelike — grafika jest nieważna! (210 słów) Przeczytaj teraz »

Maskotka haker.info

Postać Mr. At nawiązuje do gier z gatunku roguelike/ASCII RPG w których do wyświetlania grafiki korzysta się ze znaków tekstowych. Znak @ (at) w grach roguelike przeważnie oznacza postać bohatera.

Kontakt

mgr inż. Dawid Farbaniec  //  haker.iиfø

E-mail:
office@haker.info

Odwiedź mnie również na:

 

Wyrazy uznania: 📜 Credits page

Wszystkie treści umieszczone na tej witrynie są chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawartości tej witryny bez zgody autora. Wszelkie opublikowane tutaj treści (w tym kody źródłowe i inne) służą wyłącznie celom informacyjnym oraz edukacyjnym. Właściciele tej witryny nie ponoszą odpowiedzialności za ewentualne niezgodne z prawem wykorzystanie zasobów dostępnych w witrynie. Użytkownik tej witryny oświadcza, że z zamieszczonych tutaj danych korzysta na własną odpowiedzialność. Wszelkie znaki towarowe i nazwy zastrzeżone zostały użyte jedynie w celach informacyjnych i należą wyłącznie do ich prawnych właścicieli. Autor tej witryny w czasie tworzenia treści nie działa w imieniu firm, których technologie czy produkty opisuje — chyba, że jest to jasno oznaczone. Korzystając z zasobów witryny haker.info oświadczasz, że akceptujesz powyższe warunki oraz politykę prywatności.