Programowanie w asemblerze Uruchamianie programów

Podobne dokumenty
Architektura komputerów

Programowanie Niskopoziomowe

Adam Kotynia, Łukasz Kowalczyk

Architektura komputerów

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Buffer Overflow (art. 2) by h07

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

002 Opcode Strony projektu:

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

PROGRAMOWANIE NISKOPOZIOMOWE

Systemy Operacyjne - Operacje na plikach

Programowanie niskopoziomowe

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie w asemblerze Środowiska 64-bitowe

Programowanie w asemblerze Aspekty bezpieczeństwa

Optymalizacja szelkodów w Linuksie

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

Błędy łańcuchów formatujących (format string) by h07

Metody Realizacji Języków Programowania

Programowanie w asemblerze Środowiska 64-bitowe

Wstęp do programowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Programowanie niskopoziomowe

Wprowadzenie do tworzenia kodów powłoki w systemie Linux. by h07 (h07@interia.pl)

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 7. Karol Tarnowski A-1 p.

Architektura komputerów

Visual Basic Debugging and Error Handling

Mieszko Cichowicz. Spis Treści

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

Programowanie Systemów Wbudowanych

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Ćwiczenie 3. Konwersja liczb binarnych

Ćwiczenie nr 6. Programowanie mieszane

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Mikroinformatyka. Wielozadaniowość

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Pwn-ing Linux x86/x64 Zadania kwalifikacyjne

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Przepełnienie bufora i łańcuchy formatujace

Programowanie Niskopoziomowe

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Programowanie Niskopoziomowe

Niech wynik od 0 do 200F wyświetla w trzech kolumnach: F = (wartość) C = (wyliczona wartość) K = (wyliczona wartość)

Tworzenie oprogramowania

Programowanie Niskopoziomowe

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Wstęp do Programowania, laboratorium 02

Assembler w C++ Syntaksa AT&T oraz Intela

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Buffer Overflow w Windows, symulacja włamania do systemu z wykorzystaniem błędu usługi sieciowej. by h07 (h07@interia.pl)

Programowanie Proceduralne

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

1.Wstęp. 2.Generowanie systemu w EDK

Informacje organizacyjne

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Metody Realizacji Języków Programowania

Spis treści JĘZYK C - ŚLEDZENIE WYKONANIA PROGRAMU, DEBUGGER. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Pobieranie argumentów wiersza polecenia

Argumenty wywołania programu, operacje na plikach

Język asembler dla każdego

Mikroinformatyka. Mechanizmy ochrony pamięci

C++ - [1-3] Debugowanie w Qt Creator

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Podstawy Programowania

Podstawy Programowania.

/*W tym miejscu funkcja system wywołuje systemową komendę PAUSE tj.czeka tak długo, aż zostanie wciśnięty dowolny znak z

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie w asemblerze Linkowanie

Ćwiczenie 1. Przygotowanie środowiska JAVA

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Return-oriented exploiting

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Shellcody a architektura MIPS na systemach IRIX. Adam Zabrocki.

Tworzenie projektu asemblerowego dla środowiska Visual Studio 2008.

Programowanie w asemblerze Wprowadzenie

Systemy wbudowane. Rysunek 1: Ilustracja procesu kompilacji oprogramowania

Sprzęt i architektura komputerów

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 3 - sem.iii. Dr inż. M. Czyżak

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 2. Krzysztof Lichota

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

1 Podstawy c++ w pigułce.


Programowanie w asemblerze Architektury równoległe

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Kurs STARTER S5. Spis treści. Dzień 1. III Budowa wewnętrzna, działanie i obsługa sterownika (wersja 0504)

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Programowanie w Javie

Transkrypt:

Programowanie w asemblerze Uruchamianie programów 17 stycznia 2017

Uruchamianie programów Przy uruchamianiu i badaniu zachowania programów systemowych używa się wielu narzędzi. Prostsze z ich, takie jak strace, pozwalaja pasywnie śledzić działanie programu. Bardziej skomplikowane sa debuggery, pozwalajace zatrzymywać program i analizować zawartość pamięci.

Programy śledzace Do śledzenia wywołań systemowych służy w Linuksie program strace (w innych Uniksach istnieja podobne narzędzia, np. truss). Informacje prezentowane przez strace można również wydobyć z podsystemu /proc. Majac kultowy program w C #include <stdio.h> int main (int argc, char **argv) printf("witaj świecie\n"); spróbujemy go prześledzić używajac strace.

Programy śledzace katastrofa:~/akpn$ gcc -static -o hello hello.c katastrofa:~/akpn$ strace./hello execve("./hello", ["./hello"], [/* 54 vars */]) = 0 fcntl64(0, F_GETFD) = 0 fcntl64(1, F_GETFD) = 0 fcntl64(2, F_GETFD) = 0 geteuid32() = 1000 getuid32() = 1000 getegid32() = 100 getgid32() = 100 brk(0) = 0x80ad8f4 brk(0x80ae8f4) = 0x80ae8f4 brk(0x80af000) = 0x80af000 fstat64(1, st_mode=s_ifchr 0620, st_rdev=makedev(136, 3),...) = 0 old_mmap(null, 4096, PROT_READ PROT_WRITE, MAP_PRIVATE MAP_ANONYMOUS, write(1, "Witaj \266wiecie\n", 14Witaj świecie ) = 14 munmap(0x40000000, 4096) = 0 exit_group(14) =? katastrofa:~/akpn$

Programy śledzace Uwaga: Opcja -static znaczaco zmniejsza długość śladu, ale nie należy jej używać bez potrzeby. strace pokazuje wszystkie wykonane wywołania systemowe wraz z argumentami i zwracanymi wartościami.

Programy śledzace Popatrzmy na wersję w asemblerze section.text global _start ;dla linkera (ld) msg db Witaj świecie!,0xa ;napis do wypisania len equ $ - msg ;i jego długość _start: ;początek mov edx,len ;długość mov ecx,msg ;adres napisu mov ebx,1 ;deskryptor (stdout) mov eax,4 ;wywołanie systemowe write int 0x80 mov eax,1 ;wywołanie systemowe exit int 0x80

Programy śledzace Teraz ślad będzie znacznie krótszy katastrofa:~/akpn$ nasm -f elf hello.asm katastrofa:~/akpn$ ld -o hello hello.o katastrofa:~/akpn$ strace./hello execve("./hello", ["./hello"], [/* 54 vars */]) = 0 write(1, "Witaj świecie!\n", 15Witaj świecie! ) = 15 _exit(1) =? katastrofa:~/akpn$

Programy śledzace Na zakończenie szef kuchni poleca katastrofa:~/akpn$ strace strace./hello

Posługiwanie się debuggerem Debugger jest to narzędzie, które pozwala zatrzymać wykonywany program i zbadać lub zmienić jego stan. Typowy debugger pozwala: określać miejsca (nazywane przystankami breakpoints), w których program powinien zatrzymać się i przekazać sterowanie debuggerowi; wykonywać program krokowo, tzn. zatrzymywać się każdorazowo po wykonaniu pojedynczej instrukcji; ogladać i zmieniać wartości zmiennych zatrzymanego programu (a także instrukcje), po czym wznawiać jego działanie. Dodatkowo niektóre debuggery pozwalaja określać warunki, których spełnienie powoduje zatrzymanie programu.

Posługiwanie się debuggerem Modyfikacje programu przez debugger sa dokonywane bezpośrednio na obrazie programu w pamięci i nie zmieniaja kodu źródłowego. Z NASMem dobrze współpracował program ald przeznaczony przede wszystkim do znajdowania błędów w programach systemowych. Niestety od jakiegoś czasu (2004) nie jest już rozwijany i pozostało nam gdb ale nauczyło się już składni NASMa.

Posługiwanie się debuggerem Wróćmy do naszego pliku hello.asm Po zasemblowaniu i zlinkowaniu przystapimy do ogladania i modyfikacji naszego pliku. $ nasm -g -f elf hello.asm $ ld -o hello hello.o... Najpierw musimy wywołać program debuggera: $ gdb hello... (gdb) Debugger oczekuje na nasze polecenia, sygnalizujac to promptem gdb.

Posługiwanie się debuggerem Kończymy pracę poleceniem quit (wiele poleceń można skracać, w tym przypadku wystarcza q) (gdb) q $ _ Moim ulubionym poleceniem jest help goraco polecam (bo podręcznik gdb ma kilkaset stron)!

Posługiwanie się debuggerem Do ogladania zawartości rejestrów służy polecenie (gdb) info registers eax 0x22c8e0 2279648 ecx 0x226070 2252912 edx 0x21bd10 2211088 ebx 0x22bfc4 2277316 esp 0xbffff2a0 0xbffff2a0 ebp 0x0 0x0 esi 0xbffff2ac -1073745236 edi 0x80481c0 134513088 eip 0x80481c4 0x80481c4 <_start+4> eflags 0x200282 [ SF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51

Posługiwanie się debuggerem Polecenie info ma wiele innych przydatnych argumentów. Zawartość rejestru można zmienić poleceniem set $eax=1 Poleceniem p (print) (gdb) print $xmm0 można dokładniej obejrzeć pojedynczy rejestr (zwłaszcza gdy zawiera wartości upakowane). Polecenie x (od examine) pozwala precyzyjnie sterować wyświetlaniem. Polecenie where wyświetla stos wywołań.

Programowanie Podstawowym przeznaczeniem debuggera (dla nas) jest testowanie niewielkich programów w języku wewnętrznym. Polecenie list pozwala obejrzeć kod (części) programu: parametr to numer środkowej linii w wyświetlanym ciagu instrukcji.

Programowanie Używajac set disassembly-flavor intel będziemy mieli składnię zbliżona do NASM. (gdb) list 8 3 section.data 4 output: 5 db The processor Vendor ID is xxxxxxxxxxxx \n 6 output_len equ $-output 7 8 section.text 9 global _start 10 _start: 11 mov eax,0 12 cpuid

Uruchomienie wykonania Do uruchamiania programu przeznaczone sa następujace polecenia. Polecenie (gdb) run powoduje uruchomienie wykonania programu od poczatku. Polecenie (gdb) continue kontynuuje wykonanie zatrzymanego program poczynajac od bieżacej instrukcji (zgodnie z bieżac a zawartościa rejestru EIP).

Punkty zatrzymania Wykonanie programu odbywa się do końca, chyba że określono przystanki (breakpoints). Sa one adresami instrukcji, po dojściu do których wykonywanie programu ma zostać przerwane, a sterowanie powróci do debuggera. Ustawiamy je poleceniem break, podajac np. numer instrukcji (numery instrukcji można uzyskać poleceniem list): (gdb) break 25

Tryb krokowy Dodatkowe polecenia uruchamiajace sa przeznaczone do pracy w trybie krokowym. Polecenie step w najprostszej postaci powoduje wykonanie pojedynczej instrukcji. (gdb) step 26 mov ebx, 0x8048231 Opcjonalny argument pozwala określić liczbę rozkazów, które maja zostać wykonane. (gdb) step 5

Tryb krokowy Uwaga: Jeśli bieżac a instrukcja jest int lub call, to użycie polecenia step spowoduje wejście w śledzenie procedury obsługi przerwania lub procedury bibliotecznej (która bywa dłuuuuga). Polecenie next pozwala uniknac wchodzenia w głab procedur. (gdb) next 5 27 test eax, eax

Dodatkowe informacje Przystanki sa realizowane zwykle przez wstawienie w odpowiednie miejsca w programie poniższej instrukcji (z zachowaniem poprzedniej zawartości i odtworzeniem jej po jakimkolwiek zatrzymaniu). int 3 Instrukcję taka warto również umieszczać na końcu testowanego programu. Śledzenie krokowe realizuje się przez ustawienie flagi TF w procesorze.