# 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