---
# System prepended metadata

title: Pwndbg sprint 2 (23.08.2022)

---

# Pwndbg sprint 2 (23.08.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

#### Easy to do:
* [ ] Pozbyć się `tests.sh` - [Artur]
* [ ] Split production and dev dependencies -- see [#1077](https://github.com/pwndbg/pwndbg/issues/1077)
* [x] Install Zig compiler for test setup from a tarball instead of using `snap install zig --classic --edge` -- see [#1088](https://github.com/pwndbg/pwndbg/issues/1088) [Albert] PR: [#1089](https://github.com/pwndbg/pwndbg/pull/1089)
* [x] Allow for launching `./tests.sh <test-name> --pdb` -- see [#1085](https://github.com/pwndbg/pwndbg/issues/1085)
* [ ] 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)
* [ ] Highlight registers whose value has changed between two program stops with a red colour -- see [#1082](https://github.com/pwndbg/pwndbg/issues/1082)
* [x] Add a flag to the `telescope` command to display previous addresses -- see [#1047](https://github.com/pwndbg/pwndbg/issues/1047); but TL;DR: -- [Nika]
  * the `telescope <addr> <count>` will show dereferences of <count> consecutive addresses starting from <addr>
  * see e.g. `telescope $rsp 10`
  * however, sometimes you want to see dereference of addresses before the given address
  * so adding a `--reversed` flag would be handy!
     * Is there a better name for this flag? 
* [ ] paginate heap chunks in the `vis_heap_chunks` command -- see [#1072](https://github.com/pwndbg/pwndbg/issues/1072)
    * TL;DR: When there is tons of output, we do want to paginate it and allow user to hit <enter> to git more results instead of printing things forever   
* [ ] Display addresses before the provided address argument in the `telescope` command output -- see [#1071](https://github.com/pwndbg/pwndbg/issues/1071) [maciek]
  * The issue shows a patch to do that but lists improvements that needs to be done to it
* [x] Add underlining of freed heap memory chunks in `vis_heap_chunk` command output [Albert]
  * Note: This should be rather easy but may require to learn a little bit about glibc heap (just ask disconnect3d)
  * This would require wrapping `out += color_func(cell_hex)` in underline function when the chunk is already freed
* [ ] Better UX for `dt` command -- see [#255](https://github.com/pwndbg/pwndbg/issues/255)
  * Invoking `dt <non-existing-type>` should not display compiling errors by default and only inform user that we failed to find the type in headers and if the user wants to see the whole error, we should have a `--debug` or `--verbose` flag?
  * Is `dt` really needed? Perhaps we can leave it be.
  * Are there any flags from `windbg`'s `dt` command that we should implement? Please try to see how it is in windbg and document in #255
    

### Rozpoczęte taski z poprzednich sprintów
* [ ] Bundlowanie Pwndbg w jeden skrypt - Hubert
* [ ] [Renderowanie argumentów printf-podobnych funkcji](#Renderowanie-argumentów-printf-podobnych-funkcji)
  * tego bym nie robił, to względnie trudne choć rozpoczęte
* [ ] [Dodanie funkcjonalności/komendy "dump memory as code"](#Dodanie-funkcjonalnościkomendy-“dump-memory-as-code”) -- vesim
  * Vesim musi to przerobić na flagę do obecnie istniejących komend

# Inne taski/po polsku

## Dodanie komendy `patch <adres> <dane lub instrukcje>`

Przydałaby się komenda do "patchowania" kodu, tak, żeby można było w łatwy sposób zmienić kod programu na inny - na przykład usunąć "ifa" z programu, albo zrobić tak, żeby dana funkcja zawsze zwracała zero (lub inną wartość).

Przykładowo, `patch 0x1234 nop; nop; nop` (na x86/x64) powinno wpisać pod adres `0x1234` zasemblowane instrukcje `nop; nop; nop`, czyli wartość `0x90` trzy razy, bo instrukcja `nop`, która jest tak zwanym "no operation", tzn. nic nie robi, odpowiada właśnie bajtowi 0x90 na architekturach x86/x64.

Przydatne rzeczy:
- musimy stworzyć nową komendę w pliku `pwndbg/commands/patch.py` - możemy
Do tego zadania przyda się biblioteka [`pwntools`](http://docs.pwntools.com/en/latest/) (którą trzeba dodać jako zależność)


Kod plus minus:
```py
# prawdopodobnie trzeba string arch jakoś zmapować z nazw Pwndbg na nazwy architektur używane przez Pwntools
import pwnlib

arch = pwndbg.arch.current
data = pwnlib.asm.asm(assembly_code, arch=arch)
pwndbg.memory.write(address, data)
```

Potencjalne rozszerzenia:
1. Zamiast pobierać architekturę za każdym razem podczas wykonywania komendy, moglibyśmy ustawiać `pwnlib.context.context.arch = ...` gdy ustawiane jest `pwndbg.arch.current`
2. Można rozszerzyć interfejs tak, aby pozwolić wprowadzać bajty instrukcji heksadecymalnie, zamiast tylko poprzez instrukcje asemblera; na przykład:
  - `patch 0x1234 0x90` - powinno wpisać pod `0x1234` bajt `0x90` (czyli instrukcję `nop` na x86/x64)
  - `patch 0x1234 9090` - powinno wpisać dwie instrukcje `nop`
    - Do zastanowienia się: czy powinniśmy supportować hexy bez prefixu `0x`?
3. Można zapisywać listę wszystkich dodanych patchy i wtedy:
  - `patch --list` - listowałoby zaaplikowane patche
  - `patch --disable <id...>` - wyłączałoby dane patche
  - `patch --enable <id...>` - włączałoby dane patche
  - `patch --revert <id...>` - pozwołiłoby zrevertować dany patch
  - `patch --revert-all` - cofałoby wszystkie patche
4. Powinniśmy pozwalać na export patchy do pliku
5. Dodanie testów :)

Potencjalne problemy:
- Co z rebase'owaniem binarki (ASLR/PIE)?

## Dodanie testów do wybranych funkcjonalności
- obecnie Pwndbg ma dość mało testów
- testy na CI są uruchamiane przez `PWNDBG_GITHUB_ACTIONS_TEST_RUN=1 sudo --preserve-env ./tests.sh` i są zaimplementowane w `./tests/`

Potrzebujemy testów m.in. dla wielu komend:
- `hexdump ...`
- nawigacja po programie - `nextret`, `nextsyscall`, `stepsyscall`, etc.
- wyszukanie wartości w programie: `search ...`
- zmieniania uprawnień do pamięci - `mprotect`
- listowanie layoutu pamięci - `vmmap`
  - również dla targetów z QEMU user emulation
  - również dla targetów z QEMU kernel
- komend wyświetlających pamięć w ciekawy sposób - `probeleak`, `leakfind`
- (bardzo trudne) funkcjonalności związane ze stertą (heap) z Pull Requesta, dla różnych wersji glibc i architektur
    
    
    
# Randomowe tematy
    
* RE: Manjaro - https://news.ycombinator.com/item?id=32503090