# Pwndbg sprint 3 (22.09.2022) Hi, witaj na sprincie Pwndbg! Poniżej jest lista tasków, które możemy robić (ofc można wymyślić coś swojego, jeśli zna się projekt :P). * Repo projektu: https://github.com/pwndbg/pwndbg/ * Discord: https://discord.gg/TMHXF8jp Sprint zaczniemy od małego wstępu "co to jest Pwndbg" i "co mogę z tym zrobić", a następnie podzielimy się na zadania wylistowane poniżej (ofc można dodać również i swoje). ### Jak rozpocząć debugowanie programu w GDB? ```bash $ echo 'int main() { puts("Hello world"); )}' > a.c $ gcc a.c $ gdb --quiet ./a.out pwndbg> break main pwndbg> continue ``` Przydatne komendy: ``` break <symbol/adres> - ustawia breakpoint na danym adresie run [<args>] - uruchamia procesu z danymi argumentami (jeśli nie ustawiliśmy breakpointa, to proces może się skończyć) starti [<args>] - uruchamia proces i zatrzymuje się na jego pierwszej instrukcji continue - kontynuuje wykonywanie programu si - skrót od "step instruction", czyli: wykonaj dokładnie jedną instrukcję (wchodząc również do funkcji które są wywoływane) ni - skrót od "next instruction", czyli: wykonaj jedną instrukcję, ale jeśli jest ona wywołaniem funkcji (np. instrukcja "call") to wykonaj całe wnętrze i zatrzymaj się dopiero na następnej instrukcji w funkcji w której jesteśmy info break - wyświetl ustawione breakpointy delete <numer-bp> - usuwa dany breakpoint; jeśli nie podamy numeru, to usunie wszystkie print <wyrazenie> - oblicz i wypisz dane wyrażenie x/10i $rip - komenda GDB "examine", posiadająca różne formaty; tu: wyświetlająca 10 instrukcji rozpoczynając od adresu z rejestru RIP (IP == Instruction Pointer), który wskazuje na instrukcję którą program będzie właśnie wykonywać info reg - albo krócej "i r" - skrót od "info registers" - wyświetla info o rejestrach procesora i r all - info o WSZYSTKICH rejestrach CPU bt - skrót od "backtrace" - wyświetla call stack, tzn. listę funkcji w które weszliśmy pokolei info threads - wyświetla listę wątków programu ``` Polecam również [GDB cheatsheet](https://darkdust.net/files/GDB%20Cheat%20Sheet.pdf). ### Tasks * [ ] Catch more specific exceptions in except clauses -- see [#1081](https://github.com/pwndbg/pwndbg/issues/1081) * [ ] Display emulation information in the DISASM context panel -- see [#1069](https://github.com/pwndbg/pwndbg/issues/1069) * [ ] Testy, testy, testy * Większość komend nie ma testów: https://github.com/pwndbg/pwndbg/tree/dev/pwndbg/commands * Testy są tu: https://github.com/pwndbg/pwndbg/tree/dev/tests * Przykładowo, można dodać testy do komend związanych z nawigacją po programie: `nextret`, `nextsyscall`, itd. * [ ] (disco) Bugfix: nextproginstr -- see [#1153](https://github.com/pwndbg/pwndbg/issues/1153) * nextproginstr to komenda, która powinna zatrzymać się na **następnej instrukcji programu** ale z jakiegoś powodu nie działa obecnie * Możliwe, że to bug w GDB? * [ ] Move pwntools commands to real pwndbg commands -- see [#1074](https://github.com/pwndbg/pwndbg/issues/1074) * Wcześniej, pwntools nie było zależnością Pwndbg, ale jeśli dało się go zaimportować, to dodawaliśmy komendy z pwntools jako komendy Pwndbg * Obecnie, pwntools mamy jako zależność i można lepszy UX dla tych komend zrobić (bo niektóre nie do końca działają) * [ ] Make it easier to work with PIE binaries -- see [#1144](https://github.com/pwndbg/pwndbg/issues/1144) * See https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables * [ ] Przeportowanie komend z projektu pwngdb -- see [#886](https://github.com/pwndbg/pwndbg/issues/886) * [ ] Dodać komendę do "PTR_DEMANGLE" z glibc * to dość trudny task * https://github.com/lattera/glibc/blob/895ef79e04a953cac1493863bcae29ad85657ee1/sysdeps/unix/sysv/linux/x86_64/sysdep.h#L387-L403 * Przydatne: > The pointer encryption guard value is initialized by the dynamic linker in the case of a dynamically linked executable and by the C library startup code in the case of a statically linked executable. > > The dynamic linker exposes two variables, __pointer_chk_guard_local is hidden and can be used by dynamic linker code to access the guard value more efficiently, and __pointer_chk_guard is global and should be used by the dynamically linked C library. ``` pwndbg> p/x __pointer_chk_guard_local $2 = 0x2b47e56bc794b475 pwndbg> vmmap &__pointer_chk_guard_local LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA 0x7ffff7ffc000 0x7ffff7ffd000 r--p 1000 29000 /lib/x86_64-linux-gnu/ld-2.27.so +0x730 ``` * Przerobienie interfejsu komendy `patch` * Ostatnio dodałem komendę do patchowania kodu `patch ...` * Oraz komendy `patch_list`, `patch_revert` * Ale te dwie ostatnie, są kiepskie, powinny być subkomendami komendy `patch` np. `patch --list` albo `patch --revert <id patcha>` * mprotect - Albert