====== GDB Cheatsheet ====== Ce document a pour but de réunir différentes astuces pour accélérer le debugging sous GDB (ou apprendre à l'utiliser).\\ FIXME A compléter et à réorganiser. * **Poser un breakpoint à n'importe quelle adresse** \\ Il suffit de faire: break *0xdeadbeef (attention à ne pas oublier le caractère '*' devant l'adresse). * **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 break __libc_start_main 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: gdb $ bt #0 0x4ad8b5c0 in %%__%%libc_start_main () from /lib/libc.so.6 #1 0x08048391 in ?? (). L'adresse de retour dans l'exemple est 0x08048391. On regarde donc quelques instructions en arrière pour trouver le bon push: x/5i 0x08048391-11 0x8048380: push 0x8048530 0x8048385: push ecx 0x8048386: push esi 0x8048387: push 0x8048495 0x804838c: call 0x8048360 <__libc_start_main@plt> (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é info files Ce qui vous donnera une réponse de ce typeSymbols 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 .bssCe qui nous intéresse c'est le **.text**, et pour finir et obtenir le désassemblage, il vous suffit de fairedisas 0x080484a0,0x0804896c * **Lire une chaîne de caractères dont l'adresse est stockée sur la pile** (dans cet exemple, esp+4) print (char*) *(char**)($esp+4) ou x/s $esp+4 * **Sauter à n'importe quelle adresse à exécuter** Il suffit de taper set $eip = 0xdeadbeef continue * **GDB QUICK REFERENCE** Un petit document "quick reference" qui regroupe les principales commandes de GDB avec à chaque fois une explication rapide : http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf !