diff --git a/.editorconfig b/.editorconfig index afce7e399..be8ec9af6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,4 +21,4 @@ indent_style = space indent_size = 2 [*.md] -max_line_length=100 +max_line_length = 100 diff --git a/docs/.markdownlint.yaml b/docs/.markdownlint.yaml new file mode 100644 index 000000000..8e74f3862 --- /dev/null +++ b/docs/.markdownlint.yaml @@ -0,0 +1,259 @@ +# Default state for all rules +default: true + +# Path to configuration file to extend +extends: null + +# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time +MD001: true + +# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading +MD002: + # Heading level + level: 1 + +# MD003/heading-style/header-style - Heading style +MD003: + # Heading style + style: "consistent" + +# MD004/ul-style - Unordered list style +MD004: + # List style + style: "consistent" + +# MD005/list-indent - Inconsistent indentation for list items at the same level +MD005: true + +# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line +MD006: true + +# MD007/ul-indent - Unordered list indentation +MD007: + # Spaces for indent + indent: 2 + # Whether to indent the first level of the list + start_indented: false + # Spaces for first level indent (when start_indented is set) + start_indent: 2 + +# MD009/no-trailing-spaces - Trailing spaces +MD009: + # Spaces for line break + br_spaces: 2 + # Allow spaces for empty lines in list items + list_item_empty_lines: false + # Include unnecessary breaks + strict: false + +# MD010/no-hard-tabs - Hard tabs +MD010: + # Include code blocks + code_blocks: false + # Fenced code languages to ignore + ignore_code_languages: [] + # Number of spaces for each hard tab + spaces_per_tab: 4 + +# MD011/no-reversed-links - Reversed link syntax +MD011: true + +# MD012/no-multiple-blanks - Multiple consecutive blank lines +MD012: + # Consecutive blank lines + maximum: 2 + +# MD013/line-length - Line length +MD013: + # Number of characters + line_length: 100 + # Number of characters for headings + heading_line_length: 100 + # Number of characters for code blocks + code_block_line_length: 100 + # Include code blocks + code_blocks: false + # Include tables + tables: false + # Include headings + headings: true + # Include headings + headers: true + # Strict length checking + strict: false + # Stern length checking + stern: false + +# MD014/commands-show-output - Dollar signs used before commands without showing output +MD014: true + +# MD018/no-missing-space-atx - No space after hash on atx style heading +MD018: true + +# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading +MD019: true + +# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading +MD020: true + +# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading +MD021: true + +# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines +MD022: + # Blank lines above heading + lines_above: 1 + # Blank lines below heading + lines_below: 1 + +# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line +MD023: true + +# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content +MD024: + # Only check sibling headings + allow_different_nesting: false + # Only check sibling headings + siblings_only: false + +# MD025/single-title/single-h1 - Multiple top-level headings in the same document +MD025: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD026/no-trailing-punctuation - Trailing punctuation in heading +MD026: + # Punctuation characters not allowed at end of headings + punctuation: ".,;:!。,;:!" + +# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol +MD027: true + +# MD028/no-blanks-blockquote - Blank line inside blockquote +MD028: true + +# MD029/ol-prefix - Ordered list item prefix +MD029: + # List style + style: "one_or_ordered" + +# MD030/list-marker-space - Spaces after list markers +MD030: + # Spaces for single-line unordered list items + ul_single: 2 + # Spaces for single-line ordered list items + ol_single: 2 + # Spaces for multi-line unordered list items + ul_multi: 2 + # Spaces for multi-line ordered list items + ol_multi: 2 + +# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines +MD031: + # Include list items + list_items: true + +# MD032/blanks-around-lists - Lists should be surrounded by blank lines +MD032: true + +# MD033/no-inline-html - Inline HTML +MD033: + # Allowed elements + allowed_elements: [] + +# MD034/no-bare-urls - Bare URL used +MD034: true + +# MD035/hr-style - Horizontal rule style +MD035: + # Horizontal rule style + style: "consistent" + +# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading +MD036: + # Punctuation characters + punctuation: ".,;:!?。,;:!?" + +# MD037/no-space-in-emphasis - Spaces inside emphasis markers +MD037: true + +# MD038/no-space-in-code - Spaces inside code span elements +MD038: true + +# MD039/no-space-in-links - Spaces inside link text +MD039: true + +# MD040/fenced-code-language - Fenced code blocks should have a language specified +MD040: + # List of languages + allowed_languages: [] + # Require language only + language_only: false + +# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading +MD041: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD042/no-empty-links - No empty links +MD042: true + +# MD043/required-headings/required-headers - Required heading structure +MD043: + # List of headings + headings: [] + # List of headings + headers: [] + # Match case of headings + match_case: false + +# MD044/proper-names - Proper names should have the correct capitalization +MD044: + # List of proper names + names: [] + # Include code blocks + code_blocks: false + # Include HTML elements + html_elements: false + +# MD045/no-alt-text - Images should have alternate text (alt text) +MD045: true + +# MD046/code-block-style - Code block style +MD046: + # Block style + style: "consistent" + +# MD047/single-trailing-newline - Files should end with a single newline character +MD047: true + +# MD048/code-fence-style - Code fence style +MD048: + # Code fence style + style: "consistent" + +# MD049/emphasis-style - Emphasis style should be consistent +MD049: + # Emphasis style should be consistent + style: "consistent" + +# MD050/strong-style - Strong style should be consistent +MD050: + # Strong style should be consistent + style: "consistent" + +# MD051/link-fragments - Link fragments should be valid +MD051: true + +# MD052/reference-links-images - Reference links and images should use a label that is defined +MD052: true + +# MD053/link-image-reference-definitions - Link and image reference definitions should be needed +MD053: + # Ignored definitions + ignored_definitions: + - "//" diff --git a/docs/api.md b/docs/api.md index 3b23b4500..34dfc1353 100644 --- a/docs/api.md +++ b/docs/api.md @@ -33,6 +33,7 @@ register_external_command(NewCommand()) ``` Loading it in `GEF` is as easy as + ``` gef➤ source /path/to/newcmd.py [+] Loading 'NewCommand' @@ -61,15 +62,17 @@ We make GEF aware of this new command by registering it in the `__main__` sectio invoking the global function `register_external_command()`. Now you have a new GEF command which you can load, either from cli: + ```bash gef➤ source /path/to/newcmd.py ``` + or add to your `~/.gdbinit`: + ```bash -$ echo source /path/to/newcmd.py >> ~/.gdbinit +echo source /path/to/newcmd.py >> ~/.gdbinit ``` - ## Customizing context panes Sometimes you want something similar to a command to run on each break-like event and display itself @@ -119,20 +122,22 @@ gef➤ pi help(Architecture) or even from outside GDB: ```bash -$ gdb -q -ex 'pi help(hexdump)' -ex quit +gdb -q -ex 'pi help(hexdump)' -ex quit ``` The GEF API aims to provide a simpler and more Pythonic approach to GDB's. Some basic examples: -- read the memory -```python +* read the memory + +```text gef ➤ pi print(hexdump( gef.memory.read(parse_address("$pc"), length=0x20 ))) 0x0000000000000000 f3 0f 1e fa 31 ed 49 89 d1 5e 48 89 e2 48 83 e4 ....1.I..^H..H.. 0x0000000000000010 f0 50 54 4c 8d 05 66 0d 01 00 48 8d 0d ef 0c 01 .PTL..f...H..... ``` -- get access to the memory layout +* get access to the memory layout + ``` gef ➤ pi print('\n'.join([ f"{x.page_start:#x} -> {x.page_end:#x}" for x in gef.memory.maps])) 0x555555554000 -> 0x555555558000 @@ -148,18 +153,15 @@ gef ➤ pi print('\n'.join([ f"{x.page_start:#x} -> {x.page_end:#x}" for x in ge [...] ``` - The API also offers a number of decorators to simplify the creation of new/existing commands, such as: -- `@only_if_gdb_running` to execute only if a GDB session is running. -- `@only_if_gdb_target_local` to check if the target is local i.e. not debugging using GDB `remote`. -- and many more... - +* `@only_if_gdb_running` to execute only if a GDB session is running. +* `@only_if_gdb_target_local` to check if the target is local i.e. not debugging using GDB `remote`. +* and many more... ### Reference For a complete reference of the API offered by GEF, visit [`docs/api/gef.md`](api/gef.md). - ### Parsing command arguments ```python @@ -179,12 +181,10 @@ using a type of `tuple` or `list` for the default value. `parse_arguments` will of what to expect based on the first default value of the iterable, so make sure it's not empty. For instance: - ```python @parse_arguments( {"instructions": ["nop", "int3", "hlt"], }, {"--arch": "x64", } ) ``` - Argument flags are also supported, allowing to write simpler version of the flag such as ```python @@ -227,11 +227,11 @@ Sometimes architectures can more precisely determine whether they apply to the c looking at the architecture determined by gdb. For these cases the custom architecture may implement the `supports_gdb_arch()` static function to signal that they should be used instead of the default. The function receives only one argument: -- `gdb_str` (of type `str`) which is the architecture name as reported by GDB. +* `gdb_str` (of type `str`) which is the architecture name as reported by GDB. The function **must** return: -- `True` if the current `Architecture` class supports the target binary; `False` otherwise. -- `None` to simply ignore this check and let GEF try to determine the architecture. +* `True` if the current `Architecture` class supports the target binary; `False` otherwise. +* `None` to simply ignore this check and let GEF try to determine the architecture. One example is the ARM Cortex-M architecture which in some cases should be used over the generic ARM one: diff --git a/docs/commands/aslr.md b/docs/commands/aslr.md index 54e4c9e5c..3fc3fa7bf 100644 --- a/docs/commands/aslr.md +++ b/docs/commands/aslr.md @@ -3,12 +3,14 @@ Easily check, enable or disable ASLR on the debugged binary. Check the status: + ``` gef➤ aslr ASLR is currently disabled ``` Activate ASLR: + ``` gef➤ aslr on [+] Enabling ASLR @@ -17,6 +19,7 @@ ASLR is currently enabled ``` De-activate ASLR: + ``` gef➤ aslr off [+] Disabling ASLR diff --git a/docs/commands/canary.md b/docs/commands/canary.md index 9bbbd2755..c190d5205 100644 --- a/docs/commands/canary.md +++ b/docs/commands/canary.md @@ -5,6 +5,7 @@ If the currently debugged process was compiled with the Smash Stack Protector (S canary. This makes it convenient to avoid manually searching for this value in memory. The command `canary` does not take any arguments. + ``` gef➤ canary ``` diff --git a/docs/commands/checksec.md b/docs/commands/checksec.md index a1aa97a9c..1fa14714f 100644 --- a/docs/commands/checksec.md +++ b/docs/commands/checksec.md @@ -4,6 +4,7 @@ The `checksec` command is inspired from [`checksec.sh`](https://www.trapkit.de/t It provides a convenient way to determine which security protections are enabled in a binary. You can use the command on the currently debugged process: + ``` gef➤ checksec [+] checksec for '/vagrant/test-bin' @@ -19,5 +20,5 @@ Full RelRO: No Or specify directly the binary to check, for example: ```bash -$ gdb -ex "checksec ./tests/test-x86" +gdb -ex "checksec ./tests/test-x86" ``` diff --git a/docs/commands/config.md b/docs/commands/config.md index b10cf8670..ba2a15c65 100644 --- a/docs/commands/config.md +++ b/docs/commands/config.md @@ -5,24 +5,29 @@ specified via the `GEF_RC` environment variable. In addition, `gef` can also be runtime with the `gef config` command. To view all settings for all commands loaded: + ``` gef➤ gef config ``` + ![gef-config](https://i.imgur.com/bd2ZqsU.png) Or to get one setting value: + ``` gef➤ gef config pcustom.struct_path ``` Of course you can edit the values. For example, if you want the screen to be cleared before displaying the current context when reaching a breakpoing: + ``` gef➤ gef config context.clear_screen 1 ``` To save the current settings for `GEF` to the file system to have those options persist across all your future `GEF` sessions, simply run: + ``` gef➤ gef save [+] Configuration saved to '/home/vagrant/.gef.rc' @@ -32,6 +37,7 @@ Upon startup, if `$GEF_RC` points to an existing file, or otherwise if `${HOME}/ `gef` will automatically load its values. To reload the settings during the session, just run: + ``` gef➤ gef restore [+] Configuration from '/home/hugsy/.gef.rc' restored diff --git a/docs/commands/context.md b/docs/commands/context.md index 7c08eac05..ea3e047cc 100644 --- a/docs/commands/context.md +++ b/docs/commands/context.md @@ -2,7 +2,6 @@ ![gef-context](https://i.imgur.com/aZiG8Yb.png) - `gef` (not unlike `PEDA` or `fG! famous gdbinit`) provides comprehensive context menu when hitting a breakpoint. @@ -54,6 +53,7 @@ just omit it. ``` gef➤ gef config context.layout "-legend regs stack code args -source -threads -trace extra memory" ``` + This configuration will not display the `legend`, `source`, `threads`, and `trace` sections. The `memory` pane will display the content of all locations specified by the @@ -80,12 +80,14 @@ The size of most sections are also customizable: To have the stack displayed with the largest stack addresses on top (i.e., grow the stack downward), enable the following setting: + ``` gef➤ gef config context.grow_stack_down True ``` If the saved instruction pointer is not within the portion of the stack being displayed, then a section is created that includes the saved ip and depending on the architecture the frame pointer. + ``` 0x00007fffffffc9e8│+0x00: 0x00007ffff7a2d830 → <__main+240> mov edi, eax ($current_frame_savedip) 0x00007fffffffc9e0│+0x00: 0x00000000004008c0 → <__init+0> push r15 ← $rbp @@ -108,12 +110,14 @@ setting `context.redirect` variable to have the context sent to another section. To do so, select the TTY/file/socket/etc. you want the context redirected to with `gef config`. Enter the command `tty` in the prompt: + ``` $ tty /dev/pts/0 ``` Then tell `gef` about it! + ``` gef➤ gef config context.redirect /dev/pts/0 ``` @@ -121,8 +125,8 @@ gef➤ gef config context.redirect /dev/pts/0 Enjoy: ![gef-context-redirect-section](https://i.imgur.com/sWlX37q.png) - To go back to normal, remove the value: + ``` gef➤ gef config context.redirect "" ``` @@ -130,11 +134,13 @@ gef➤ gef config context.redirect "" ### Display individual sections ### You can display a single section by specifying it as an argument: + ``` gef➤ context regs ``` Multiple sections can be provided, even if they are not part of the current layout: + ``` gef➤ context regs stack ``` @@ -142,46 +148,55 @@ gef➤ context regs stack ### Examples ### * Display the code section first, then register, and stack, hiding everything else: + ``` gef➤ gef config context.layout "code regs stack" ``` * Stop showing the context sections when breaking: + ``` gef➤ gef config context.enable 0 ``` * Clear the screen before showing the context sections when breaking: + ``` gef➤ gef config context.clear_screen 1 ``` * Don't dereference the registers in the `regs` section (more compact): + ``` gef➤ gef config context.show_registers_raw 1 ``` * Number of bytes of opcodes to display next to the disassembly. + ``` gef➤ gef config context.show_opcodes_size 4 ``` * Don't 'peek' into the start of functions that are called. + ``` gef➤ gef config context.peek_calls False ``` * Hide specific registers from the registers view. + ``` gef➤ gef config context.ignore_registers "$cs $ds $gs" ``` * Hide the extra pc context info from the source code view. + ``` gef➤ gef config context.show_source_code_variable_values 0 ``` * Show better definitions for call to libc functions. + ``` gef➤ gef config context.libc_args True gef➤ gef config context.libc_args_path /path/to/gef-extras/libc_args diff --git a/docs/commands/dereference.md b/docs/commands/dereference.md index 69e528cc8..bc815f158 100644 --- a/docs/commands/dereference.md +++ b/docs/commands/dereference.md @@ -12,7 +12,7 @@ dereference (by default, `$sp`), the number of consecutive addresses to derefere ``` gef➤ dereference -0x00007fffffffdec0│+0x0000: 0x00007ffff7ffe190 → 0x0000555555554000 → jg 0x555555554047 ← $rsp, $r13 +0x00007fffffffdec0│+0x0000: 0x00007ffff7ffe190 → 0x0000555555554000 → jg 0x555555554047 ← $rsp, $r13 0x00007fffffffdec8│+0x0008: 0x00007ffff7ffe730 → 0x00007ffff7fd3000 → 0x00010102464c457f 0x00007fffffffded0│+0x0010: 0x00007ffff7faa000 → 0x00007ffff7de9000 → 0x03010102464c457f 0x00007fffffffded8│+0x0018: 0x00007ffff7ffd9f0 → 0x00007ffff7fd5000 → 0x00010102464c457f @@ -70,6 +70,7 @@ gef➤ dereference $sp -l 7 -r $rbp Just like with `x`, you can pass a negative number of addresses to dereference, to examine memory backwards from the start address: + ``` gef➤ dereference $sp -l 3 0x00007fffffffcf90│+0x0010: 0x00007ffff7f5aaa0 → 0x0000000000000000 diff --git a/docs/commands/edit-flags.md b/docs/commands/edit-flags.md index e507cc0b1..70d3faec2 100644 --- a/docs/commands/edit-flags.md +++ b/docs/commands/edit-flags.md @@ -5,9 +5,11 @@ the flag register for the architectures that support it. Without argument, the c return a human-friendly display of the register flags. One or many arguments can be provided, following the syntax below: + ``` gef➤ flags [(+|-|~)FLAGNAME ...] ``` + Where `FLAGNAME` is the name of the flag (case insensitive), and `+|-|~` indicates the action on whether to set, unset, or toggle the flag. @@ -17,4 +19,5 @@ instruction), but we want to have the Carry flag set, simply go with: ``` gef➤ flags -ZERO +CARRY ``` + ![flags](https://i.imgur.com/ro7iC5m.png) diff --git a/docs/commands/format-string-helper.md b/docs/commands/format-string-helper.md index 17d7164e5..a23df368a 100644 --- a/docs/commands/format-string-helper.md +++ b/docs/commands/format-string-helper.md @@ -20,6 +20,7 @@ gef➤ fmtstr-helper ``` Then start the binary execution. + ``` gef➤ r ``` @@ -28,4 +29,3 @@ If a potentially insecure entry is found, the breakpoint will trigger, stop the display the reason for trigger and the associated context. ![fmtstr-helper-example](https://i.imgur.com/INU3KGn.png) - diff --git a/docs/commands/functions.md b/docs/commands/functions.md index c13562436..2d367262f 100644 --- a/docs/commands/functions.md +++ b/docs/commands/functions.md @@ -14,12 +14,12 @@ These functions can be used as arguments to other commands to dynamically calcul ``` gef➤ deref -l 4 $_heap() -0x0000000000602000│+0x00: 0x0000000000000000 ← $r8 +0x0000000000602000│+0x00: 0x0000000000000000 ← $r8 0x0000000000602008│+0x08: 0x0000000000000021 ("!"?) -0x0000000000602010│+0x10: 0x0000000000000000 ← $rax, $rdx +0x0000000000602010│+0x10: 0x0000000000000000 ← $rax, $rdx 0x0000000000602018│+0x18: 0x0000000000000000 gef➤ deref -l 4 $_heap(0x20) -0x0000000000602020│+0x00: 0x0000000000000000 ← $rsi +0x0000000000602020│+0x00: 0x0000000000000000 ← $rsi 0x0000000000602028│+0x08: 0x0000000000020fe1 0x0000000000602030│+0x10: 0x0000000000000000 0x0000000000602038│+0x18: 0x0000000000000000 diff --git a/docs/commands/gef-remote.md b/docs/commands/gef-remote.md index 756cf8d68..7a5615c5e 100644 --- a/docs/commands/gef-remote.md +++ b/docs/commands/gef-remote.md @@ -10,6 +10,7 @@ process of debugging more cumbersome. GEF greatly improves that state with the ` `target remote` command. For many reasons, you **cannot** use `target remote` alone with GEF. `gef-remote` can function in 2 ways: + - `remote` which is meant to enrich use of GDB `target remote` command, when connecting to a "real" gdbserver instance - `qemu-mode` when connecting to GDB stab of either `qemu-user` or `qemu-system`. @@ -79,14 +80,12 @@ that, all of GEF features are available: ![gef-remote-command](https://i.imgur.com/05epyX6.png) - #### `remote-extended` Extended mode works the same as `remote`. Being an extended session, gdbserver has not spawned or attached to any process. Therefore, all that's required is to add the `--pid` flag when calling `gef-remote`, along with the process ID of the process to debug. - ### Qemu mode Qemu mode of `gef-remote` allows to connect to the [Qemu GDB @@ -101,13 +100,12 @@ makes now even more sense 😉 And using it is very straight forward. ![qemu-user](https://user-images.githubusercontent.com/590234/175072835-e276ab6c-4f75-4313-9e66-9fe5a3fd220e.png) - #### `qemu-system` To test locally, you can use the mini image linux x64 vm [here](https://mega.nz/file/ldQCDQiR#yJWJ8RXAHTxREKVmR7Hnfr70tIAQDFeWSYj96SvPO1k). + 1. Run `./run.sh` 2. Use `--qemu-user` and `--qemu-binary vmlinuz` when starting `gef-remote` - ![qemu-system](https://user-images.githubusercontent.com/590234/175071351-8e06aa27-dc61-4fd7-9215-c345dcebcd67.png) diff --git a/docs/commands/gef.md b/docs/commands/gef.md index 5f687786d..6d781c11d 100644 --- a/docs/commands/gef.md +++ b/docs/commands/gef.md @@ -29,7 +29,6 @@ gef➤ gef missing [*] Command `XXXX` is missing, reason → YYYYY. ``` - ### GEF Config Command Allows the user to set/view settings for the current debugging session. For making the changes @@ -111,7 +110,6 @@ within the command. gef➤ gef run ./binary ``` - ### GEF Install Command `gef install` allows to install one (or more) specific script(s) from `gef-extras`. The new scripts @@ -124,7 +122,6 @@ gef➤ gef install SCRIPTNAME1 [SCRIPTNAME2...] Where `SCRIPTNAME1` ... are the names of script from the [`gef-extras` repository](https://github.com/hugsy/gef-extras/tree/main/scripts/). - ``` gef➤ gef install remote windbg stack [+] Searching for 'remote.py' in `gef-extras@main`... @@ -139,6 +136,7 @@ gef➤ This makes it easier to deploy new functionalities in limited environment. By default, the command looks up for script names in the `main` branch of `gef-extras`. However you can change specify a different branch through the `gef.default_branch` configuration setting: + ``` gef➤ gef config gef.default_branch dev ``` diff --git a/docs/commands/got.md b/docs/commands/got.md index 25b129a84..746784a52 100644 --- a/docs/commands/got.md +++ b/docs/commands/got.md @@ -4,6 +4,7 @@ Display the current state of GOT table of the running process. The `got` command optionally takes function names and filters the output displaying only the matching functions. + ``` gef➤ got ``` @@ -11,6 +12,7 @@ gef➤ got ![gef-got](https://i.imgur.com/554ebM3.png) The applied filter partially matches the name of the functions, so you can do something like this. + ``` gef➤ got str gef➤ got print @@ -20,6 +22,7 @@ gef➤ got read ![gef-got-one-filter](https://i.imgur.com/IU715CG.png) Example of multiple partial filters: + ``` gef➤ got str get ``` diff --git a/docs/commands/heap-analysis-helper.md b/docs/commands/heap-analysis-helper.md index 65a74fbd4..bf9bfd870 100644 --- a/docs/commands/heap-analysis-helper.md +++ b/docs/commands/heap-analysis-helper.md @@ -30,13 +30,13 @@ enable/disable manually punctual checks via the `gef config` command. The following settings are accepted: -* `check_null_free`: to break execution when a free(NULL) is encountered (disabled by default); -* `check_double_free`: to break execution when a double free is encountered; +- `check_null_free`: to break execution when a free(NULL) is encountered (disabled by default); +- `check_double_free`: to break execution when a double free is encountered; ![double-free](https://i.imgur.com/S7b4FJa.png) -* `check_weird_free`: to execution when `free()` is called against a non-tracked pointer; -* `check_uaf`: to break execution when a possible Use-after-Free condition is found. +- `check_weird_free`: to execution when `free()` is called against a non-tracked pointer; +- `check_uaf`: to break execution when a possible Use-after-Free condition is found. ![uaf](https://i.imgur.com/NfV5Cu9.png) diff --git a/docs/commands/heap.md b/docs/commands/heap.md index ab85fb6e0..e5447d4f7 100644 --- a/docs/commands/heap.md +++ b/docs/commands/heap.md @@ -30,7 +30,6 @@ gef➤ gef config gef.bruteforce_main_arena True Note that this might take a few seconds to complete. If GEF does find the symbol you can then calculate the offset to the libc base address and save it in the config. - ### `heap chunks` command ### Displays all the chunks from the `heap` section of the current arena. diff --git a/docs/commands/highlight.md b/docs/commands/highlight.md index 81b8989c0..bf45a848e 100644 --- a/docs/commands/highlight.md +++ b/docs/commands/highlight.md @@ -77,4 +77,3 @@ support._ ## Colors To find a list of supported colors, check the [theme](./theme.md#changing-colors) documentation. - diff --git a/docs/commands/hijack-fd.md b/docs/commands/hijack-fd.md index 7b4fd9222..0998e6135 100644 --- a/docs/commands/hijack-fd.md +++ b/docs/commands/hijack-fd.md @@ -4,27 +4,29 @@ file descriptor can point to a file, a pipe, a socket, a device etc. To use it, simply run + ``` gef➤ hijack-fd FDNUM NEWFILE ``` For instance, + ``` gef➤ hijack-fd 1 /dev/null ``` + Will modify the current process file descriptors to redirect STDOUT to `/dev/null`. - This command also supports connecting to an ip:port if it is provided as an argument. For example + ``` gef➤ hijack-fd 0 localhost:8888 ``` -Will redirect STDIN to localhost:8888 +Will redirect STDIN to localhost:8888 Check out the tutorial on GEF's YouTube channel: [![yt-tuto-hijack-fd](https://img.youtube.com/vi/Ss_QFeYkEvk/0.jpg)](https://www.youtube.com/watch?v=Ss_QFeYkEvk) - diff --git a/docs/commands/memory.md b/docs/commands/memory.md index 676065629..61a539cb9 100644 --- a/docs/commands/memory.md +++ b/docs/commands/memory.md @@ -9,12 +9,12 @@ _Note_: this command **shoud NOT** be mistaken with the [GDB `watch` command](https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Watchpoints.html) meant to set breakpoints on memory access (read,write,exec). - ### Adding a watch Specify a location to watch and display with the context, along with their optional size and format: Syntax: + ``` memory watch
[SIZE] [(qword|dword|word|byte|pointers)] ``` @@ -39,34 +39,34 @@ Which, when the `context` is displayed, will show something like: ![](https://i.imgur.com/3YabwYv.png) - ### Removing a watch Remove a watched address. To list all the addresses being watched, use `memory list`. Syntax: + ``` memory unwatch
``` - ### Listing watches Enumerate all the addresses currently watched by the `memory` command. Syntax: + ``` memory list ``` The command will output a list of all the addresses watched, along with the size and format to display them as. - ### Resetting watches Empties the list of addresses to watch. Syntax: + ``` memory reset ``` diff --git a/docs/commands/name-break.md b/docs/commands/name-break.md index c0c6175f4..9201f34f5 100644 --- a/docs/commands/name-break.md +++ b/docs/commands/name-break.md @@ -32,7 +32,7 @@ Example output: 0x400e18 mov QWORD PTR [rbp-0x50], rsi 0x400e1c mov rax, QWORD PTR fs:0x28 ───────────────────────────────────────────────────────────────────────────────── stack ──── -0x00007fffffffe288│+0x0000: 0x0000000000401117 → movzx ecx, al ← $rsp +0x00007fffffffe288│+0x0000: 0x0000000000401117 → movzx ecx, al ← $rsp 0x00007fffffffe290│+0x0008: 0x00007fffffffe4b8 → 0x00007fffffffe71d → "/ctf/t19/srv_copy" 0x00007fffffffe298│+0x0010: 0x0000000100000000 0x00007fffffffe2a0│+0x0018: 0x0000000000000000 diff --git a/docs/commands/nop.md b/docs/commands/nop.md index 7c3ab011b..74917d2af 100644 --- a/docs/commands/nop.md +++ b/docs/commands/nop.md @@ -18,36 +18,43 @@ instructions it overwrites `--b` Instead of replacing whole instructions, fill ITEMS bytes with nops nop the current instruction ($pc): + ```bash -gef➤ nop +gef➤ nop ``` nop an instruction at $pc+3 address: + ```bash -gef➤ nop $pc+3 +gef➤ nop $pc+3 ``` nop two instructions at address $pc+3: + ```bash -gef➤ nop --i 2 $pc+3 +gef➤ nop --i 2 $pc+3 ``` Replace 1 byte with nop at current instruction ($pc): + ```bash -gef➤ nop --b +gef➤ nop --b ``` Replace 1 byte with nop at address $pc+3: + ```bash -gef➤ nop --b $pc+3 +gef➤ nop --b $pc+3 ``` Replace 2 bytes with nop(s) (breaking the last instruction) at address $pc+3: + ```bash -gef➤ nop --f --b --i 2 $pc+3 +gef➤ nop --f --b --i 2 $pc+3 ``` Patch 2 nops at address $pc+3: + ```bash -gef➤ nop --n --i 2 $pc+3 +gef➤ nop --n --i 2 $pc+3 ``` diff --git a/docs/commands/pcustom.md b/docs/commands/pcustom.md index d7d3a4666..b2387ff32 100644 --- a/docs/commands/pcustom.md +++ b/docs/commands/pcustom.md @@ -9,30 +9,34 @@ This is achieved via the command `pcustom` (for `print custom`), or you can use reference to the WinDBG command) as provided by the [`WinDbg compatibility extension`](https://github.com/hugsy/gef-extras/blob/main/scripts/windbg.py) - ### Configuration New structures can be stored in the location given by the configuration setting: + ``` gef➤ gef config pcustom.struct_path ``` + By default, this location is in `$TEMP/gef/structs` (e.g. `/tmp/user/1000/gef/structs`). The structure can be created as a simple `ctypes` structure, in a file called `.py`. You can naturally set this path to a new location + ``` gef➤ gef config pcustom.struct_path /my/new/location ``` + And save this change so you can re-use it directly next time you use `gdb` + ``` gef➤ gef save [+] Configuration saved to '~/.gef.rc' ``` - ### Using user-defined structures You can list existing custom structures via + ``` gef➤ pcustom list [+] Listing custom structures from '/tmp/structs' @@ -82,14 +86,14 @@ class person_t(Structure): ] _values_ = [ - # You can define a function to substitute the value - ("age", lambda age: "Old" if age > 40 else "Young"), - # Or alternatively a list of 2-tuples - ("id", [ - (0, "root"), - (1, "normal user"), - (None, "Invalid person") - ]) + # You can define a function to substitute the value + ("age", lambda age: "Old" if age > 40 else "Young"), + # Or alternatively a list of 2-tuples + ("id", [ + (0, "root"), + (1, "normal user"), + (None, "Invalid person") + ]) ] ``` @@ -118,7 +122,6 @@ Additionally, if you have successfully configured your IDA settings, you can als the structure(s) that was(were) reverse-engineered in IDA directly in your GDB session: ![ida-structure-examples](https://i.imgur.com/Tnsf6nt.png) - (see `gef-extras/ida-rpyc`, which is the new improved version of `ida-interact`) - #### Dynamic `ctypes.Structure`-like classes `pcustom` also supports the use of class factories to create a `ctypes.Structure` class whose @@ -127,6 +130,7 @@ currently debugged binary, the architecture, the size of a pointer and more). The syntax is relatively close to the way we use to create static classes (see above), but instead we define a function that will generate the class. The requirements for this class factory are: + - take a single [`Gef`](https://github.com/hugsy/gef/blob/dev/docs/api/gef.md#class-gef) positional argument - End the function name with `_t` @@ -179,18 +183,19 @@ def person_t(gef: Optional["Gef"]==None): return person_cls ``` - ### Public repository of structures A community contributed repository of structures can be found in [`gef-extras`](https://github.com/hugsy/gef-extras). To deploy it: In bash: + ``` -$ git clone https://github.com/hugsy/gef-extras +git clone https://github.com/hugsy/gef-extras ``` In GEF: + ``` gef➤ gef config pcustom.struct_path /path/to/gef-extras/structs gef➤ gef save diff --git a/docs/commands/print-format.md b/docs/commands/print-format.md index 1401e3992..bcb449222 100644 --- a/docs/commands/print-format.md +++ b/docs/commands/print-format.md @@ -10,7 +10,6 @@ following the format specified. Currently, the output formats supported are - Hex string (`hex`) - For patch byte command or GDB $_gef[N] byte access (`bytearray`) - ``` gef➤ print-format -h [+] print-format [--lang LANG] [--bitlen SIZE] [(--length,-l) LENGTH] [--clip] LOCATION diff --git a/docs/commands/process-search.md b/docs/commands/process-search.md index 62a24e675..96d585e4d 100644 --- a/docs/commands/process-search.md +++ b/docs/commands/process-search.md @@ -41,7 +41,7 @@ So, for example, if your targeted process is called `/home/foobar/plop`, but the is used through `socat`, like ``` -$ socat tcp-l:1234,fork,reuseaddr exec:/home/foobar/plop +socat tcp-l:1234,fork,reuseaddr exec:/home/foobar/plop ``` Then every time a new connection is opened to tcp/1234, `plop` will be forked, and GEF can easily diff --git a/docs/commands/reset-cache.md b/docs/commands/reset-cache.md index f1d1924cf..be5db7de2 100644 --- a/docs/commands/reset-cache.md +++ b/docs/commands/reset-cache.md @@ -1,3 +1,3 @@ ## Command `reset-cache` -This command is only useful for debugging `GEF` itself. \ No newline at end of file +This command is only useful for debugging `GEF` itself. diff --git a/docs/commands/search-pattern.md b/docs/commands/search-pattern.md index dc5044a82..0e587468c 100644 --- a/docs/commands/search-pattern.md +++ b/docs/commands/search-pattern.md @@ -2,6 +2,7 @@ `gef` allows you to search for a specific pattern at runtime in all the segments of your process memory layout. The command `search-pattern`, alias `grep`, aims to be straight-forward to use: + ``` gef➤ search-pattern MyPattern ``` @@ -25,6 +26,7 @@ For this reason, the alias `xref` also points to the command `search-pattern`. command above is equivalent to `xref 0x4005f6` which makes it more intuitive to use. ### Searching in a specific range ### + Sometimes, you may need to search for a very common pattern. To limit the search space, you can also specify an address range or the section to be checked. @@ -34,6 +36,7 @@ gef➤ search-pattern 0x4005f6 little 0x603100-0x603200 ``` ### Searching in a specific range using regex ### + Sometimes, you may need an advanced search using regex. Just use --regex arg. Example: how to find null-end-printable(from x20-x7e) C strings (min size >=2 bytes) with a regex: diff --git a/docs/commands/shellcode.md b/docs/commands/shellcode.md index f2d70b47b..56996ac9c 100644 --- a/docs/commands/shellcode.md +++ b/docs/commands/shellcode.md @@ -29,4 +29,3 @@ shell-storm.org Shellcode ARM without 0x20, 0x0a and 0x00 [...] ``` - diff --git a/docs/commands/skipi.md b/docs/commands/skipi.md index 68ca46243..a7565c2e1 100644 --- a/docs/commands/skipi.md +++ b/docs/commands/skipi.md @@ -11,8 +11,8 @@ skipi [LOCATION] [--n NUM_INSTRUCTIONS] `--n NUM_INSTRUCTIONS` Skip the specified number of instructions instead of the default 1. ```bash -gef➤ skipi -gef➤ skipi --n 3 -gef➤ skipi 0x69696969 -gef➤ skipi 0x69696969 --n 6 -``` \ No newline at end of file +gef➤ skipi +gef➤ skipi --n 3 +gef➤ skipi 0x69696969 +gef➤ skipi 0x69696969 --n 6 +``` diff --git a/docs/commands/trace-run.md b/docs/commands/trace-run.md index 1b30977dd..c9261f417 100644 --- a/docs/commands/trace-run.md +++ b/docs/commands/trace-run.md @@ -17,4 +17,3 @@ By using the script `ida_color_gdb_trace.py` on the text file generated, it will taken: ![trace-run-2](https://i.imgur.com/oAGoSMQ.png) - diff --git a/docs/commands/xor-memory.md b/docs/commands/xor-memory.md index 3c252611a..851a09278 100644 --- a/docs/commands/xor-memory.md +++ b/docs/commands/xor-memory.md @@ -3,6 +3,7 @@ This command is used to XOR a block of memory. Its syntax is: + ``` xor-memory
``` diff --git a/docs/compat.md b/docs/compat.md index 7b0d9b065..473414190 100644 --- a/docs/compat.md +++ b/docs/compat.md @@ -9,6 +9,4 @@ This matrix indicates the version of Python and/or GDB | [2022.01](https://github.com/hugsy/gef/releases/tag/2021.01) | 7.7 | Python 3.4+ | | [Current](https://github.com/hugsy/gef/tree/main) | 8.0+ | Python 3.6+ | - - * Up to - included diff --git a/docs/faq.md b/docs/faq.md index b065907cf..4c895fbf3 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,6 +1,5 @@ # Frequently Asked Questions # - ## Why use GEF over PEDA? ## [PEDA](https://github.com/longld/peda) is a fantastic tool that provides similar commands to make @@ -35,8 +34,7 @@ If you are running an obsolete version, GEF will show a error and message and ex Some pre-compiled static binaries for both recent GDB and GDBServer can be downloaded from the [`gdb-static`](https://github.com/hugsy/gdb-static) repository. - -## I cannot get GEF setup!! ## +## I cannot get GEF setup ## GEF will work on any GDB 8+ compiled with Python 3.6+ support. You can view that commands that failed to load using `gef missing`, but this will not affect GEF generally. @@ -79,7 +77,6 @@ readline_compat = True You can now use all features of `gef` even on versions of GDB compiled against old `readline` library. - ## Does GEF prevent the use of other GDB plugins? ## Definitely not! You can use any other GDB plugin on top of it for an even better debugging @@ -93,8 +90,6 @@ Some interesting plugins highly recommended too: ![voltron](https://i.imgur.com/bfTIjNi.jpg) Src: [@rick2600: terminator + gdb + gef + voltron cc: @snare @_hugsy_](https://twitter.com/rick2600/status/775926070566490113) - - ## I want to contribute, where should I head first? ## I would suggest thoroughly reading this documentation, just having a look to the @@ -104,7 +99,6 @@ give you pointers. Also a good thing would be to join our [Discord channel](https://discord.gg/HCS8Hg7) to get in touch with the people involved/using it. - ## I think I've found a bug, how can I help fixing it? ## `gef` is only getting better through people (like you!) using it, but most importantly reporting @@ -116,9 +110,11 @@ happens, you'll only get to see a message like this: ![gef-exception](https://i.imgur.com/J7dUnXV.png) By switching to debug mode, `gef` will give much more information: + ``` gef➤ gef config gef.debug 1 ``` + ![gef-debug](https://i.imgur.com/SGe8oFF.png) If you think fixing it is in your skills, then send a [Pull @@ -128,7 +124,6 @@ what was your solution for it. Otherwise, you can open an [issue](https://github.com/hugsy/gef/issues), give a thorough description of your bug and copy/paste the content from above. This will greatly help for solving the issue. - ## I get weird issues/characters using GDB + Python3, what's up? ## Chances are you are not using UTF-8. Python3 is [highly relying on @@ -141,7 +136,7 @@ In addition, some unexpected results were observed when your local is not set to aren't sure, simply run `gdb` like this: ``` -$ LC_ALL=en_US.UTF-8 gdb /path/to/your/binary +LC_ALL=en_US.UTF-8 gdb /path/to/your/binary ``` ## GDB crashes on ARM memory corruption with `gdb_exception_RETURN_MASK_ERROR` ## @@ -160,7 +155,7 @@ Debian/Kali for ARM > simple ARM assembly program (noted above) when instead of exiting cleanly, > gdb's disassembly failed with a SIGABRT and threw an exception: > -> `gdb_exception_RETURN_MASK_ERROR` +> `gdb_exception_RETURN_MASK_ERROR` > > This turns out to be a known problem (regression) with gdb, and affects > gef users running the ARM platform (Raspberry Pi). @@ -174,7 +169,7 @@ Therefore, there is nothing GEF's developers can do about that. The correct solu above is to recompile your GDB with a newer (better) version. The whole topic was already internally discussed, so please refer to the [issue -#206](https://github.com/hugsy/gef/issues/206) for the whole story. +# 206](https://github.com/hugsy/gef/issues/206) for the whole story. ## I still don't have my answer... Where can I go? @@ -189,7 +184,7 @@ can! ## How can I use GEF to debug a process in a container? GEF can attach to a process running in a container using `gdb --pid=$PID`, where `$PID` is the ID of -the running process *on the host*. To find this, you can use `docker top -o pid | awk +the running process _on the host_. To find this, you can use `docker top -o pid | awk '!/PID/' | xargs -I'{}' pstree -psa {}` to view the process tree for the container. `sudo` may be required to attach to the process, which will depend on your system's security diff --git a/docs/functions/base.md b/docs/functions/base.md index ec442adef..eadc98a27 100644 --- a/docs/functions/base.md +++ b/docs/functions/base.md @@ -10,6 +10,7 @@ $_base([filepath]) ``` Example: + ``` gef➤ p $_base(\"/usr/lib/ld-2.33.so\") ``` diff --git a/docs/functions/bss.md b/docs/functions/bss.md index 055f34d7a..ac9c67fc8 100644 --- a/docs/functions/bss.md +++ b/docs/functions/bss.md @@ -9,6 +9,7 @@ $_bss([offset]) ``` Example: + ``` gef➤ p $_bss(0x20) ``` diff --git a/docs/functions/got.md b/docs/functions/got.md index cb2ff95d7..9070df006 100644 --- a/docs/functions/got.md +++ b/docs/functions/got.md @@ -9,6 +9,7 @@ $_got([offset]) ``` Example: + ``` gef➤ p $_got(0x20) ``` diff --git a/docs/functions/heap.md b/docs/functions/heap.md index a7ae27269..7dd365205 100644 --- a/docs/functions/heap.md +++ b/docs/functions/heap.md @@ -9,6 +9,7 @@ $_heap([offset]) ``` Example: + ``` gef➤ p $_heap(0x20) ``` diff --git a/docs/functions/stack.md b/docs/functions/stack.md index de825136d..374bdb979 100644 --- a/docs/functions/stack.md +++ b/docs/functions/stack.md @@ -9,6 +9,7 @@ $_stack([offset]) ``` Example: + ``` gef➤ p $_stack(0x20) ``` diff --git a/docs/index.md b/docs/index.md index 6785805e5..ec7dbf234 100644 --- a/docs/index.md +++ b/docs/index.md @@ -34,7 +34,6 @@ It requires Python 3, but [`gef-legacy`](https://github.com/hugsy/gef-legacy) ca Check out the [showroom page](https://hugsy.github.io/gef/screenshots/) for more | or [try it online yourself!](https://demo.gef.blah.cat) (user:`gef`/password:`gef-demo`) - ## Quick start ### Automated installation @@ -49,7 +48,6 @@ bash -c "$(curl -fsSL https://gef.blah.cat/sh)" For more details and other ways to install GEF please see [installation page](https://hugsy.github.io/gef/install/). - ### Run Then just start playing (for local files): @@ -73,7 +71,6 @@ local:~ $ gdb -q gef➤ gef-remote -t your.ip.address:1234 -p 666 ``` - ## Bugs & Feedbacks ## To discuss `gef`, `gdb`, exploitation or other topics, feel free to join our [Discord @@ -91,9 +88,9 @@ systems such as GrSec. `gef` was created and maintained by myself, [`@_hugsy_`](https://twitter.com/_hugsy_), but kept fresh thanks to [all the contributors](https://github.com/hugsy/gef/graphs/contributors). -[ ![contributors-img](https://contrib.rocks/image?repo=hugsy/gef) ](https://github.com/hugsy/gef/graphs/contributors) +[![contributors-img](https://contrib.rocks/image?repo=hugsy/gef)](https://github.com/hugsy/gef/graphs/contributors) -Or if you just like the tool, feel free to drop a simple *"thanks"* on Discord, Twitter or other, it +Or if you just like the tool, feel free to drop a simple _"thanks"_ on Discord, Twitter or other, it is **always** very appreciated. ## Sponsors ## @@ -110,10 +107,8 @@ dedicate more time and resources to the project: [](https://github.com/therealdreg) [](https://github.com/mikesart) - ## Extra Credits -- The GEF logo was designed by [TheZakMan](https://twitter.com/thezakman) - +* The GEF logo was designed by [TheZakMan](https://twitter.com/thezakman) -## 🍺 Happy hacking ! +## 🍺 Happy hacking diff --git a/docs/install.md b/docs/install.md index 37937b051..a23eb2132 100644 --- a/docs/install.md +++ b/docs/install.md @@ -2,11 +2,13 @@ ## Prerequisites -Specific GEF commands rely on commonly used Unix commands to extract additional information. Therefore it requires the following binaries to be present: - * `file` - * `readelf` - * `ps` - * `python3` +Specific GEF commands rely on commonly used Unix commands to extract additional information. +Therefore it requires the following binaries to be present: + +* `file` +* `readelf` +* `ps` +* `python3` Those tools are included by default in many modern distributions. If they're missing, you can use your OS package manager to install them. @@ -25,7 +27,7 @@ features, and only functional bugs will be handled. You can verify it with the following command: ```bash -$ gdb -nx -ex 'pi print(sys.version)' -ex quit +gdb -nx -ex 'pi print(sys.version)' -ex quit ``` This should display your version of Python compiled with `gdb`. @@ -42,10 +44,9 @@ There are **none**: `GEF` works out of the box! GEF itself provides most (if not all 🤯) features required for typical sessions. However, GEF can be easily extended via -- community-built scripts, functions and architectures in the repo +* community-built scripts, functions and architectures in the repo `gef-extras` (see below) -- your own script which can leverage the GEF API for the heavy lifting - +* your own script which can leverage the GEF API for the heavy lifting ## Standalone @@ -60,6 +61,7 @@ bash -c "$(curl -fsSL https://gef.blah.cat/sh)" ``` Or if you prefer `wget` + ```bash bash -c "$(wget https://gef.blah.cat/sh -O -)" ``` @@ -79,7 +81,6 @@ $ cat ~/.gdbinit source ~/.gdbinit-gef.py ``` - ### Update If your host/VM is connected to the Internet, you can update `gef` easily to the latest version @@ -98,8 +99,8 @@ updates are available, `gef` will respond `No update` instead. To contribute to GEF, you might prefer using git directly. ```bash -$ git clone --branch dev https://github.com/hugsy/gef.git -$ echo source `pwd`/gef/gef.py >> ~/.gdbinit +git clone --branch dev https://github.com/hugsy/gef.git +echo source `pwd`/gef/gef.py >> ~/.gdbinit ``` GEF is in very active development, so the default branch is `dev`. This is the @@ -109,7 +110,7 @@ However if you prefer a more stable life, you can then switch to the `main` branch: ```bash -$ git checkout main +git checkout main ``` The `main` branch gets only updated for new releases, or also when critical @@ -122,6 +123,7 @@ GEF was built to also provide a solid base for external scripts. The repository anyone can freely submit their own commands to extend GDB via GEF's API. To benefit from it: + ```bash # using the automated way ## via the install script @@ -145,7 +147,6 @@ $ gdb -ex 'gef config pcustom.struct_path "/path/to/gef-extras/structs"' -ex 'ge There, you're now fully equipped epic pwnage with **all** GEF's goodness!! - # Uninstalling GEF ## Prevent script loading @@ -170,6 +171,7 @@ source /my/path/to/gef.py ``` Will become: + ```text $ cat ~/.gdbinit # source /my/path/to/gef.py diff --git a/docs/obsolete/docs/index.md b/docs/obsolete/docs/index.md index e568da80e..7fe850a97 100644 --- a/docs/obsolete/docs/index.md +++ b/docs/obsolete/docs/index.md @@ -6,4 +6,3 @@ --- ![redirect](https://i.imgflip.com/1f0lcn.jpg) - diff --git a/docs/testing.md b/docs/testing.md index 3f21625dd..6ebd2163a 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -44,7 +44,6 @@ FAILED tests/commands/heap.py::HeapCommand::test_cmd_heap_bins_unsorted - Assert You can then use `pytest` directly to help you fix each error specifically. - #### Using `pytest` GEF entirely relies on [`pytest`](https://pytest.org) for its testing. Refer to the project @@ -85,7 +84,6 @@ environment to help you get more information about the reason of failure. One of the most convenient ways to test `gef` properly is using the `pytest` integration of modern editors such as VisualStudio Code or PyCharm. Without proper tests, new code will not be integrated. - ### Linting GEF You can use the Makefile at the root of the project to get the proper linting settings. For most