Programowanie asm, c, nauka pod hacking

Programowanie asm, c, nauka pod hacking
S6
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:2
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

99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:5 miesięcy
  • Postów:2420
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...


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 2x, ostatnio: 99xmarcin
S6
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:2
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.

AL
Co do laptopa: załóż nowy temat/pokop po starych, ale czemu nie dual boot?
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
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.

Shalom
Ghidra krul
SH
SH
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:69
0

@alagner:

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

AL
Ma to sens ale intuicja to nie wiedza (mówię za siebie oczywiście) ;)
99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:5 miesięcy
  • Postów:2420
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...


Holy sh*t, with every month serenityos.org gets better & better...
katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
1

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


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4896
0

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


Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około godziny
  • Postów:1002
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.

edytowany 2x, ostatnio: Spearhead
lion137
Zaczynamy, czytanki na długie wieczory...:)
ZI
  • Rejestracja:około 10 lat
  • Ostatnio:ponad rok
  • Postów:14
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)