Programowanie asm, c, nauka pod hacking

0

Cześć

Szukam jakiegoś materiału do nauki programowania w C oraz Asm. Obydwa języki mam na studiach, jeśli chodzi o Asm to jest to TASM. Chciałbym przerobić jakąś książkę gdzie będzie sporo przykładów w jakimś konkretnym kontekście, nie znam się na hackingu, ale wpadł mi w oko pewien tytuł, opis jest zachęcający - no i pytanie, czy ktoś może przerabiał tą książkę? Warto?

Generalnie postaram się oddzielić naukę na studia od książki, po prostu chcę coś więcej.

Art of exploitation

W książce teoretycznie są podstawy pisania exploitów, jest aktualna na rok 2008, ale z tego co widziałem w spisie treści jest nawet po krótce C od podstaw.

Pozdrawiam

2
  1. Ucz się na jakimś porządnym assemblerze. Pod security są różne podejścia jedni używają Gnu Assemblera (as lub przez GCC) inni np. jak ja NASM'a który ma wtyczki do VSCode i jest nadal rozwijany. Ma super system makr i aktywną społeczność.

Generalnie jak zaczynasz to wybór assemblera to najmniejszy problem. Upewnij się tylko że używasz składni Intela (druga składnia to AT&T). Generalnie ucz się 64-bitów, książki o 32 bitach można wyrzucić do śmietnika. Przy 64 bitach masz 16 rejestrów RAX ... RDX i potem R10 (bodajże) .. R16. Poznaj jak działa stos oraz tryby adresowania pamięci (ważne), a także little-endian. Na zajęciach z assemblera będzie sporo mało przydatnych w security pierdół w stylu coprocesor zmiennoprzecinkowy czy instrukcje wektorowe (SIMD). Tematyka OS, syscalli i poziomów ochrony i trybów pracy zostanie pewnie w ogóle pominięta.

  1. Stara i dobra książka C Programming Language będzie najlepsza, potem popatrz co dodali w C99. Zainstaluj sobie Ghidrę do dekompilacji, porównuj zdekompilowany kod z tym co masz.

Oprócz C & assemblera, musisz się jeszcze nauczyć GDB - który jest świetnym narzędziem do debugowania, śledzenia kodu.

  1. To wszystko powyższe trzeba powtarzać 2 razy, raz dla Linuxa i raz dla Windy. W Linuxie syscalle działają inaczej, format plików wykonywalnych to ELF. W Windows pliki wykonywalne .exe mają format PE (portable executable). Warto się z nimi zapoznać. Na Win jest WinGDB (są też różne nakładki). Ja radzę na razie poruszać się po Linuxie.

Polecam:

  • https://overthewire.org/wargames/ (tyle że assembler 32-bitowy, więc przestarzałe)
  • https://pwn.college/ - nowe i dobre ale bardzo szybkie tempo, nie każdy wytrzyma, trzeba już coś wiedzieć o tym jak działają OSy więc to dopiero jak już będziesz czuł się komfortowo.

Na sieci jest od groma tutoriali w tym temacie, jak jesteś zupełnie zielony to możesz przeczytać Art of exploitation ale miej świadomość że to jest stan wiedzy z przed 15 lat. Najlepiej po prostu szukać artykułów na sieci i bawić się w wargames/CTFy, czytać writeup'y, po jakimś czasie samo wejdzie do głowy...

0

Cześć

Dziękuję za odpowiedź. Brzmi dla mnie nieco egzotycznie :) Jeśli masz chwilkę, to chciałbym zadać jeszcze kilka pytań.

Wykładowca stwierdził, że chce nam pokazać czystego Asma, dlatego wybór padł na TASM. Z takim czystym TASMem zapewne niewiele jestem w stanie zrobić. Planowałem po prostu napisać kilka prostych programów, żeby go tylko ogarnąć, ale trafiłem właśnie na te exploity i zastosowanie w security. Również różnica w rozmiarze programu, który robi to samo w C i Asm jest ogromna, Asm jest pewnie szybszy?

Jeszcze jedna rzecz, wykładowca stwierdził, że skompilowanego kodu w C/C++ nie da się zreversować, w Javie się da. Czy to jakaś pomyłka?

Zdaje się, że masz o tym spore pojęcie, ja nie mam doświadczenia i żadnych nawyków. Którego Asma Ty byś wybrał gdybyś zaczynał? NASM? Rozumiem, że to jest Asm który działa na Linuxie?

Pytanie nieco odstające od tematu, mam jakieś podstawy poruszania się po Linuxie. Uczę się z użyciem laptopa z i7 9750h oraz 32gb ramu, ssd, zastanawiam się nad wyborem głównego systemu. Linux i wirtualna maszyna z Windowsem czy Windows i wirtualka z Linuxem? Która opcja może być lepsza na studiach? Praktycznie. Bo nie jestem jakoś przyzwyczajony ani do tego, ani do tego.

1

Wszystko da się zreversować, aczkolwiek narzędzia do reverse engineeringu języków działających w oparciu o VM były kiedyś lepsze niż do natywnych (oraz np. C++ bardzo skutecznie potrafi w trakcie kompilacji wyliczać sobie co tylko może, stąd zdeasemblowany może zawierać np. masę magicznych stałych).To się chyba zmieniło, tzn. narzędzia się poprawiły, z tego co zabawy IDĄ i podobnymi pamiętam, ale niech się ktoś od security tu wypowie.

0

@alagner:

Kompilacje do obu VM nie są tak agresywnie zoptymalizowane -> opt. jest przerzucona na runtime
Też musi to mieć wpływ

2

Wykładowca stwierdził, że chce nam pokazać czystego Asma, dlatego wybór padł na TASM.

Gość pewnie zna TASM'a z młodości i tak dinozauruje sobie do emerytury...

Z takim czystym TASMem zapewne niewiele jestem w stanie zrobić. Planowałem po prostu napisać kilka prostych programów, żeby go tylko ogarnąć, ale trafiłem właśnie na te exploity i zastosowanie w security.

Zapewne na tym wykładzie nie będzie ani słowa o tym jak programy wołają system operacyjny, np. jak program się chce zamknąć to woła exit(0) w C, a to po paru wygibasach skończy na wykonaniu instrukcji assemblera syscall z parametrami w rejestrach (https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md).
Nie ma syscalla nie ma exploida, musisz się tego nauczyć (a to proste) we własnym zakresie.

Również różnica w rozmiarze programu, który robi to samo w C i Asm jest ogromna, Asm jest pewnie szybszy?

Jeżeli C linkuje się dynamicznie do clib'a to nie będzie aż tak dużej różnicy. Generalnie GCC dołoży jakieś swoje sekcje plus mapowania określające jakie funkcje zaimportować z clib'a. Szybkość - zdania są podzielone....

Jeszcze jedna rzecz, wykładowca stwierdził, że skompilowanego kodu w C/C++ nie da się zreversować, w Javie się da. Czy to jakaś pomyłka?

A 0xmarcin twierdzi że dla Javy są głupionarzędzia które sprawiają że każdy patafian potrafi dekompilować (https://java-decompiler.github.io/). Są też dekompilatory do C/C++ tyle że tam jest to o wiele trudniejsze, bytecode generowany przez kompilator Javy nie podlega optymalizacji która potrafi bardzo zagmatwać kod. W Javie kod jest optymalizowany i kompilowany dopiero podczas uruchomienia programu. Ghidra to open source dekompilator do C i C++.

Zdaje się, że masz o tym spore pojęcie, ja nie mam doświadczenia i żadnych nawyków. Którego Asma Ty byś wybrał gdybyś zaczynał? NASM? Rozumiem, że to jest Asm który działa na Linuxie?

NASM jest OK i działa wszędzie. Różnice będą głównie w makrach i fajerwerkach. Same instrukcje będą wyglądać podobnie jak nie identycznie.

Pytanie nieco odstające od tematu, mam jakieś podstawy poruszania się po Linuxie. Uczę się z użyciem laptopa z i7 9750h oraz 32gb ramu, ssd, zastanawiam się nad wyborem głównego systemu. Linux i wirtualna maszyna z Windowsem czy Windows i wirtualka z Linuxem? Która opcja może być lepsza na studiach? Praktycznie. Bo nie jestem jakoś przyzwyczajony ani do tego, ani do tego.

Do security Kali Linux na VMce. Możesz też zrobić sobie dual boot'a na oba systemy...

1

Polecam książkę pt. "Sztuka penetracji"...
Masz tam całkowite podstawy, które mimo upływu lat i rozwoju technologii wciąż są żywe.

0

Zobacz na:
https://catonmat.net/top-100-books-part-five
"Programming From The Ground"

1

Najnowszą książką do asemblera jest The Art of 64-Bit Assembly, Volume 1: x86-64 Machine Organization and Programming Hyde'a, wyszła dosłownie w tym miesiącu. Omawia MASM na Windows. Gruba cegła na 1000 stron ;)

Wydaje mi się, że to jest wznowienie tej książki, tyle że z przykładami przepisanymi z assemblera HLA autora (którego nikt chyba nie używa) do bardziej rozpowszechnionego MASM-a + omówienie 64-bitowych architektur.

2

Kiedyś przeczytałem z połowę tego, żeby zrobić target x86 prostego kompilatora: http://www.egr.unlv.edu/~ed/x86.html
Moim zdaniem fajne. O security też jest trochę, ale to nie moja bajka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1