Outils d'utilisateurs

Outils du Site


reverse_engineering:gdb_cheatsheet

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 type

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

Ce qui nous intéresse c'est le .text, et pour finir et obtenir le désassemblage, il vous suffit de faire

disas 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 !

reverse_engineering/gdb_cheatsheet.txt · Dernière modification: 2017/04/09 15:33 (modification externe)