Pwn-ing Linux x86/x64 Zadania kwalifikacyjne

Podobne dokumenty
Architektura komputerów

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

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

T: Zabezpieczenie dostępu do komputera.

2 Przygotował: mgr inż. Maciej Lasota

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

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

Pliki. Informacje ogólne. Obsługa plików w języku C

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Wstęp do Programowania, laboratorium 02

Język ludzki kod maszynowy

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podstawy Programowania.

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.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Podstawy Programowania

while(wyrażenie) instrukcja

Programowanie w asemblerze Uruchamianie programów

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

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

Warszawa, r. Copyright (c) 2015 Ministerstwo Finansów

EGZAMIN MATURALNY 2011 INFORMATYKA

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

Programowanie strukturalne i obiektowe

Analiza malware Remote Administration Tool (RAT) DarkComet

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Informacje organizacyjne

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

PROGRAMOWANIE w C prolog

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

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

Pliki. Informacje ogólne. Obsługa plików w języku C

JAVA?? to proste!! Autor: wojtekb111111

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Instalacja i konfiguracja SAS PC Files Server

Informatyka I: Instrukcja 4.2

Wprowadzenie do języka Java

9. Internet. Konfiguracja połączenia z Internetem

Wskaźniki w C. Anna Gogolińska

Spis treści. 1 Moduł Modbus TCP 4

Technologie informacyjne lab. 4

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

FAQ. Kwiecień Generator Wniosków Płatniczych (GWP) Wersja 1.0

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Memeo Instant Backup Podręcznik Szybkiego Startu

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

PROGRAMOWANIE NISKOPOZIOMOWE

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Exchange 2007 Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange 2007 wersja 1.1 UNIZETO TECHNOLOGIES S.A.

Spis treści REJESTRACJA NOWEGO KONTA UŻYTKOWNIKA PANEL ZMIANY HASŁA PANEL EDYCJI DANYCH UŻYTKOWNIKA EXTRANET.NET...

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

BIURO USŁUG INFORMATYCZNYCH "T-SOFT"

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Instrukcja użytkownika Platforma transakcyjna mforex Trader dla systemu Linux

System kontroli dostępu ACCO NET Instrukcja instalacji

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

Podstawy Programowania Podstawowa składnia języka C++

Analiza możliwości złośliwego oprogramowania vjw0rm w kampanii phishingowej PayU

Instalacja i konfiguracja serwera SSH.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Programowanie mikrokontrolerów AVR

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Kalipso wywiady środowiskowe

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Wybór urządzenia/ Scanner Selection Screen: Skrócony Opis Programu MetroSet 2

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

Rozdział ten zawiera informacje na temat zarządzania Modułem Modbus TCP oraz jego konfiguracji.

Materiały wprowadzające. dr inż. Arkadiusz Chrobot

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Ćwiczenie 3. Konwersja liczb binarnych

edistro.pl Spis treści

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Opisane poniżej czynności może wykonać administrator komputera lub administrator serwera SQL (tj. użytkownik sa).

Certyfikat Certum Basic ID. Instrukcja dla użytkowników Windows Vista. wersja 1.3 UNIZETO TECHNOLOGIES SA

Instrukcja dla użytkowników Windows Vista Certyfikat Certum Basic ID

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Procedura sprawdzenia i naprawy błędów połączenia z CEPIK 2.0

Wirusy w systemie Linux. Konrad Olczak

Zmienne, stałe i operatory

Instrukcja instalacji aplikacji MuoviSelect 2.0

Architektura komputerów

Instrukcja konfigurowania sieci WiFi w Akademii Leona Koźmińskiego dla telefonów komórkowych z systemem Windows Mobile

Przepełnienie bufora i łańcuchy formatujace

Instalacja oprogramowania KISSsoft 03/2017

11. Rozwiązywanie problemów

1. Wprowadzanie danych z klawiatury funkcja scanf

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Transkrypt:

Pwn-ing Linux x86/x64 Zadania kwalifikacyjne Jakub Szewczyk kubasz51@gmail.com Grzegorz Uriasz gorbak25@gmail.com 2 czerwca 2017 Ostateczną wersję rozwiązań zadań proszę przesłać mailowo do nas w formacie pdf, w terminie podanym na stronie WWW. Zachęcamy do wcześniejszego przesłania nam rozwiązań zadań na nasze adresy mailowe będziemy wtedy w stanie powiedzieć, co jest źle i podpowiedzieć jak dopracować finalną wersję. Nie wymagamy wykonania dużej ilości zadań większa ich ilość wymagana będzie dopiero przy dużej ilości uczestników. Tak więc wyślij nam to co udało ci się wykonać. Jeżeli coś nie jest jasne, to napisz do nas z chęcią nakierujemy na literaturę bądź wytłumaczymy. Kody źródłowe programów załączonych w tych zadaniach kwalifikacyjnych są dostępne pod poniższym linkiem i qr-codem. https://goo.gl/9tyrh1 1 Korzystanie z Windowsa Nie polecamy korzystania z Windowsa, ponieważ na naszych warsztatach skupiamy się na exploitacji programów działających na Linuxie. Dlatego zachęcamy do zainstalowania dystrybucji Linuxa na swoim komputerze w konfiguracji dual boot(wybór systemu przy starcie komputera), np. Linux Mint, Antergos, Ubuntu. Inną opcją jest zainstalowanie modułu WSL na Windowsie, znanego też jako Bash on Windows - symuluje on działające jądro Linuxa na Windowsie 10, jest oficjalnym modułem Microsoftu i powinien wystarczyć do naszych zadań. Instrukcje jak go zainstalować są tu: https://msdn.microsoft.com/en-us/commandline/ wsl/install_guide. Polecamy wcześniej zaktualizować system do wydania Creator s update, WSL został tam znacznie ulepszony w stosunku do Anniversary Update. Potrzebne będzie zainstalowanie pakietów w systemach Ubuntu, Mint, bądź WSL komendą: sudo apt install libssl-dev gcc-multilib yasm 2 Dlaczego chcesz uczestniczyć w tych warsztatach? - Obowiązkowo Odpowiedz na to pytanie ściśle i zwięźle. Nie jest to zadanie typu Gdybyś był owocem, to jakim? Uzasadnij twoje stanowisko na minimalnie dwudziestu stronach A4 - oczekujemy tylko krótkiego opisu. 3 Rozgrzewka - reprezentacja binarna liczb zmiennoprzecinkowych Napisz program, który wykonuje dwie operacje (język programowania dowolny, prosimy o kod źródłowy): 1

1. Wczytuje liczbę zmiennoprzecinkową, a następnie wypisuje jej reprezentację bitową w pamięci komputera jako liczbę zmiennoprzecinkową podwójnej precyzji(double) oraz pojedynczej precyzji(float). 2. Wczytuje reprezentacje binarną liczby zmiennoprzecinkowej podwójnej precyzji w formacie litle-endian(tak jak w poprzednim podpunkcie na PC-tach się wypisze) oraz dla niej wypisuje odpowiadającą jej wartość liczbową w systemie dziesiętnym. Przykładowe wywołanie programu może przebiegać następująco: 4 Assembler Instalacja i Przetestowanie Polecamy assembler yasm (http://yasm.tortall.net/download.html), ale zadziała także nasm, fasm, lub jakikolwiek inny, jeżeli znasz jego składnię. Zainstaluj assembler, zassembluj podany poniżej program i go uruchom na Linuxie bądź WSLu, pokaż screenshoty. Nie przejmuj się, jeżeli nie rozumiesz tego kodu chodzi tylko o sprawdzenie narzędzia, podstawy assemblera wyjaśnimy na początku warsztatów. 4.1 Wersja 32-bitowa - nie działa pod WSL ;; hello.asm segment.data msg db "Hello WWW13!", 0Ah segment.text global _start _start: ; write mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, 13 int 80h ; exit mov eax, 1 xor ebx, ebx int 0x80 Komenda do zassemblowania: yasm -f elf32 -o hello.o hello.asm Komenda do zlinkowania: ld hello.o -o hello Komenda do uruchomienia:./hello 4.2 Wersja 64-bitowa - działa pod WSL ;; hello64.asm segment.data msg db "Hello WWW13!", 0Ah segment.text global _start: _start 2

; write mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, 13 syscall ; exit mov rax, 60 xor rdi, 0 syscall Komenda do zassemblowania: yasm -f elf64 -o hello64.o hello64.asm Komenda do zlinkowania: ld hello64.o -o hello64 Komenda do uruchomienia:./hello64 5 SSH Instalacja i Przetestowanie Zainstaluj SSH (zobacz opis warsztatów) i prześlij nam zrzut ekranu, co się wyświetli jak połączysz się z github.com na koncie git (komenda: ssh git@github.com, należy zaakceptować certyfikat githuba). Jeżeli wyświetli się permission denied, należy sprawdzić czy wygenerowało się swój klucz oraz czy dodało się go do konta na githubie (które warto założyć, bo nawet jeżeli na tych warsztatach się nie przyda, to później na pewno). 6 Operacje logiczne Odpowiedz na pytania i rozwiąż poniższe równania. 6.1 W jaki sposób można odejmować używając dodawania? Dodawanie na bramkach logicznych jest o wiele łatwiejsze do zrealizowania niż odejmowanie. A więc w jaki sposób używając operacji logicznych typu and, xor, or... uzyskać odejmowanie dwóch liczb binarnych mając układ dodający dwie liczby binarne do siebie? Porada: Poczytaj o reprezentacjach binarnych liczb ze znakiem. 6.2 Operacje bitowe Masz do dyspozycji 8-bitową zmienną liczbową bez znaku o nazwie Adam. Zaproponuj działania dzięki których ustawisz i-ty bit Adama na 1 oraz j-ty bit Adama na 0. W jaki sposób sprawdzić czy n-ty bit Adama jest jedynką? Oblicz na kartce(bez pomocy komputera) poniższe dwa działania: ((24 and 101) or (132 xor 241)) nor 5 =? (123 xor 153) xor (246 and 235) =? 7 Błąd w kodzie C Poniższy kod zawiera wywołanie funkcji system która otwiera powłokę systemową. Na pierwszy rzut oka dotarcie do tej linijki kodu jest niemożliwe ze względu na sprawdzenie, czy pole casual w strukturze state jest różne od 1. Otóż poniższy kod w języku C zawiera błąd który pozwala przejąć Tobie kontrolę nad polem casual. Twoim zadaniem jest przeanalizowanie kodu, znalezienie wspomnianego błędu i opisanie nam go w rozwiązaniu. W rozwiązaniu podaj przykładowe wejście które pozwala na wywołanie funkcji system oraz sposób naprawy tego błędu. 3

#include <stdio.h> #include <stdlib.h> typedef struct char tab[100]; char casual; state; state s; int main() int ans, i; printf("how many times to loop: "); scanf("%d", &ans); if(ans <0 ans >100) printf("invalid number\n"); s.casual = 1; for(i = 0; i<=ans; i++) s.tab[i] = i; if(s.casual!= 1) printf("you SHALL NOT CALL ME!\n"); system("/bin/sh"); printf("no shell for you\n"); 8 Obfuskacja kodu w C - Niewymagane, ale polecamy spróbować Zapomniałem hasła do Facebooka! Na szczęście mam zapisane to hasło na komputerze, więc teraz fakt że mam jeden port ethernet na pewno mi nie przeszkodzi (nie wiem czemu ssh na serwerze z moją kopią zapasową wymaga komputera z aż 22 portami ethernet!). Problem w tym, że analizowałem nowego wirusa krążącego po Internecie i przez przypadek go uruchomiłem. Zaszyfrował mi wszystkie pliki! Dobra wiadomość jest taka, że udało mi się uzyskać fragment kodu źródłowego wirusa, który jest odpowiedzialny za sprawdzenie, czy hasło deszyfrujące jest dobre. Ja nie mogę przeanalizować tego kodu, bo mam zaszyfrowanego vim-a, więc potrzebuję twojej pomocy. Na szczęście kod został napisany w języku C, którego składnia jest najpiękniejsza na świecie i kody są najczytelniejsze na świecie, więc nie powinieneś mieć z jego analizą najmnniejszego problemu. //0bfu5c473d p455w0rd ch3ck3r #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h> char * = "\x66\x65\x64\x05\x06\x4d\x58\x53\x56\x5f\x4d\x00\x31\x17\x0b\ \x6b\x61\x6d\x08\x32\x25\x2c\x3a\x09\x17\x00\x24\x0c\x4d"; const unsigned char* = "\x43\x2f\x45\xb4\x4c\x43\x24\x14\xd2\xf9\x7d\xf0\ \xe5\x74\x38\x18\x36\x04\x17\x76\x71\x22\x2a\x37\x76\x36\x3e\x46\x06\x0b\x77\ \x74\x28\x3b\x27\x77\x55\x4d"; char [100]; unsigned char [MD5_DIGEST_LENGTH+1]; char _; 4

void main()memset(, 0, sizeof( ));printf("enter The Password: "); scanf("%20s", );int = strlen( );int = strlen( ); for(((1&2)??(&_??))??'=((5&1)??(&_-('c'^'b')??));_< ;)((_??(??))??'= ((_% )??(??)), (3??(&_-3??))++);MD5((const unsigned char*),, (??(MD5_DIGEST_LENGTH??)=0, ));int = strlen( + +1)+3; for((6??(&_-6??))^=(7??(&_-7??)); _< ;)(??(_??) = (??(_+ +1??)^??(_%??))),(4[&_-4])++; = strlen( +MD5_DIGEST_LENGTH); for((8??(&_-8??))^=(9??(&_-9??)); _< ;)(??(_+strlen( )+1??)= (( +MD5_DIGEST_LENGTH)??(_??))^(??(_%??))),(5??(&_-5??))++; for(((1&3)??(&_-1??))??'=(((2&4))??(&_??)); _<MD5_DIGEST_LENGTH;)(_??(??)??' (_??(??))?(printf( ),exit(0)):(2??(&_-2??))++);printf( +strlen( )+1); exit(0); Kompilacja programu odbywa się poleceniem: gcc -o <nazwa pliku wyjsciowego > <kod zrodlowy > -l ssl -l crypto --trigraphs Rozwiązaniem zadania jest: 1. Co zrobiłeś by zrozumieć powyższy kod? 2. W jaki sposób powyższy kod sprawdza hasło? 3. Podaj listę metod zaciemniania zastosowanych w powyższym kodzie. 4. Podaj hasło które po wczytaniu przez program jest indentyfikowane jako poprawne. To nie jest wirus! Jeżeli w jakimś miejscu nie dajesz rady - napisz do nas - w zamian za przysłanie opisu co zrobiłeś do tej pory odsyłamy hinty. Powodzenia i do zobaczenia w Wierchomli! 5