---
# System prepended metadata

title: Pwndbg sprint 3 (22.09.2022)

---

# 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