Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
reverse_engineering:gdb_cheatsheet [2012/06/27 19:21] Fou1nard |
reverse_engineering:gdb_cheatsheet [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 6: | Ligne 6: | ||
* **Poser un breakpoint à n'importe quelle adresse** \\ | * **Poser un breakpoint à n'importe quelle adresse** \\ | ||
Il suffit de faire: <code>break *0xdeadbeef</code> (attention à ne pas oublier le caractère '*' devant l'adresse). | Il suffit de faire: <code>break *0xdeadbeef</code> (attention à ne pas oublier le caractère '*' devant l'adresse). | ||
- | * **Retrouver le "main" d'un exécutable stripped** | + | * **Retrouver le "main" d'un exécutable stripped méthode 1** |
L'adresse vers la fonction **main** est le dernier argument push avant l'appel de **%%__%%libc_start_main**. Il nous faut donc break sur cette fonction <code>break __libc_start_main</code> avant de lancer le programme. | L'adresse vers la fonction **main** est le dernier argument push avant l'appel de **%%__%%libc_start_main**. Il nous faut donc break sur cette fonction <code>break __libc_start_main</code> avant de lancer le programme. | ||
On regarde ensuite la pile d'appel (via la commande "bt") pour retrouver l'adresse de retour de la fonction **_start**, qui nous donne une sortie comme ceci: <code>gdb $ bt | On regarde ensuite la pile d'appel (via la commande "bt") pour retrouver l'adresse de retour de la fonction **_start**, qui nous donne une sortie comme ceci: <code>gdb $ bt | ||
Ligne 16: | Ligne 16: | ||
0x8048387: push 0x8048495 | 0x8048387: push 0x8048495 | ||
0x804838c: call 0x8048360 <__libc_start_main@plt></code> (on remplacera 0x08048391 par l'adresse trouvée avec "bt"), et l'adresse du main est celle du push juste avant le call. Il suffit donc de poser un breakpoint dessus pour retomber sur le main. | 0x804838c: call 0x8048360 <__libc_start_main@plt></code> (on remplacera 0x08048391 par l'adresse trouvée avec "bt"), et l'adresse du main est celle du push juste avant le call. Il suffit donc de poser un breakpoint dessus pour retomber sur le main. | ||
+ | * **Retrouver le "main" d'un exécutable stripped méthode 2** | ||
+ | Une autre méthode pour désassembler un exécutable stripped est de lancer ces commandes un fois gdb lancé <code>info files</code> Ce qui vous donnera une réponse de ce type<code>Symbols from "/home/monitor/Bureau/main". | ||
+ | Local exec file: | ||
+ | `/home/monitor/Bureau/main', file type elf32-i386. | ||
+ | Entry point: 0x80484a0 | ||
+ | 0x08048154 - 0x08048167 is .interp | ||
+ | 0x08048168 - 0x08048188 is .note.ABI-tag | ||
+ | 0x08048188 - 0x080481ac is .note.gnu.build-id | ||
+ | 0x080481ac - 0x080481d0 is .gnu.hash | ||
+ | 0x080481d0 - 0x080482a0 is .dynsym | ||
+ | 0x080482a0 - 0x0804831c is .dynstr | ||
+ | 0x0804831c - 0x08048336 is .gnu.version | ||
+ | 0x08048338 - 0x08048358 is .gnu.version_r | ||
+ | 0x08048358 - 0x08048368 is .rel.dyn | ||
+ | 0x08048368 - 0x080483b8 is .rel.plt | ||
+ | 0x080483b8 - 0x080483e6 is .init | ||
+ | 0x080483f0 - 0x080484a0 is .plt | ||
+ | 0x080484a0 - 0x0804896c is .text | ||
+ | 0x0804896c - 0x08048986 is .fini | ||
+ | 0x08048988 - 0x08048a45 is .rodata | ||
+ | 0x08048a48 - 0x08048aac is .eh_frame_hdr | ||
+ | 0x08048aac - 0x08048c30 is .eh_frame | ||
+ | 0x08049f14 - 0x08049f1c is .ctors | ||
+ | 0x08049f1c - 0x08049f24 is .dtors | ||
+ | 0x08049f24 - 0x08049f28 is .jcr | ||
+ | 0x08049f28 - 0x08049ff0 is .dynamic | ||
+ | 0x08049ff0 - 0x08049ff4 is .got | ||
+ | 0x08049ff4 - 0x0804a028 is .got.plt | ||
+ | 0x0804a028 - 0x0804a030 is .data | ||
+ | 0x0804a030 - 0x0804a050 is .bss</code>Ce qui nous intéresse c'est le **.text**, et pour finir et obtenir le désassemblage, il vous suffit de faire<code>disas 0x080484a0,0x0804896c</code> | ||
* **Lire une chaîne de caractères dont l'adresse est stockée sur la pile** (dans cet exemple, esp+4) | * **Lire une chaîne de caractères dont l'adresse est stockée sur la pile** (dans cet exemple, esp+4) | ||
<code>print (char*) *(char**)($esp+4)</code> | <code>print (char*) *(char**)($esp+4)</code> |