Program do testowania shellcode (Windows x86-32)
W ostatnim poście pisałem o tym jak napisać shellcode na Windowsa (32 bitowego). Aby sprawdzić nasz kod posłużyłem się programem asmloader autorstwa Gynvaela Coldwinda, został on napisany aby pomóc początkującym w nauce assembly (x86). Spróbujmy napisać taki program samemu, aby dopełnić dzieło. Więc co taki program będzie robić ? Pomysł jest prosty :
- alokacja pamięci (wraz z flagą PAGE_EXECUTE_READWRITE, która m.in. ustawi atrybut wykonywalności strony pamięci w której znajduje się nasz zaalokowany obszar)
- otwarcie pliku z naszym shellcodem oraz skopiowanie go do wcześniej zaalokowanej pamięci.
- skok programu w nasz zaalokowany obszar.
Flaga MEM_RESERVE oznacza że system rezerwuje dany zakres pamięci bez alokacji jej (Można zaalokować nawet 8 TB na x64 ale ta pamięć nie jest „podpięta” do pamięci fizycznej (lub pliku stronicowania)). W użyciu wraz z flagą (poprzez bitowy operator alternatywy, (tak zazwyczaj się łączy flagi)) MEM_COMMIT pozwala na operowanie tą pamięcią. Ciekawostka : wszystkie funkcje alokujące typu „malloc” czy new [] z C++ (który i tak wykonuje malloc 😜 ) ostatecznie prowadzą do wykonania VirtualAlloc.
Następnie czytamy funkcją fread z pliku do naszej zaalokowanej pamięci. Następnie przypisujemy adres zaalokowanej pamięci rzutowanej na wskaźnik na funkcję do wskaźnika na funkcję którą będziemy mogli operować. Ostatecznie wykonujemy tą funkcje. Dla systemów *nix’owych (np. Linux czy Mac OS) kod wyglądałby następująco :
Nie opisałem na jakiej zasadzie dodaje niestandardowy kolor w terminalu, ale myślę że to dobry temat na kolejny wpis 😃 shiftleft.bin to krótki kod assembly z mojego innego eksperymentu, który można traktować jako funkcje która przesuwa bitowo o RSI (argument drugi) argument pierwszy (RDI). Z ABI (Application Binary Interface) System V (z którego korzystają systemy *nix’owe) wynika że argumenty funkcji są przekazywane przez rejestry (a potem na stosie) w następującej kolejności : RDI, RSI, RDX, RCX, R8, R9.
Miłego haczenia ! 🤪