Lo primero que haremos será abrir con objdump el ejecutable ./go, para conocer la dirección
de entrada (saber desde dónde, desde qué dirección de memoria, empieza el programa a ejecutarse):
sh-3.2$ objdump -x ./go
./go: file format elf32-i386
./go
architecture: i386, flags 0x00000102:
EXEC_P, D_PAGED
start address 0x08048f50
Apuntamos la dirección de inicio: 0x08048f50
Necesitamos preparar el terreno un poco más. Vamos a examinar el ejecutable con elfsh:
$ elfsh
> load go
A continuación, dentro de elfsh, pediremos la lista de direcciones de las funciones a
las que llama el juego:
> rel
(elfsh-0.81-a8-dev@local) rel
[RELOCATION TABLES]
[Object go]
{Section .rel.dyn}
[000] R_386_GLOB_DAT 0x0804D488 sym[004] : __gmon_start__ => Create GOT entry
[001] R_386_COPY 0x0804DA40 sym[051] : stderr => Copy symbol at runtime
{Section .rel.plt}
[000] R_386_JMP_SLOT 0x0804D498 sym[001] : XDrawString => Create PLT entry
[001] R_386_JMP_SLOT 0x0804D49C sym[002] : XLookupKeysym => Create PLT entry
[002] R_386_JMP_SLOT 0x0804D4A0 sym[003] : sprintf => Create PLT entry
[003] R_386_JMP_SLOT 0x0804D4A4 sym[004] : __gmon_start__ => Create PLT entry
[004] R_386_JMP_SLOT 0x0804D4A8 sym[006] : XAutoRepeatOff => Create PLT entry
[005] R_386_JMP_SLOT 0x0804D4AC sym[007] : _ZdlPv => Create PLT entry
[006] R_386_JMP_SLOT 0x0804D4B0 sym[008] : XSetTile => Create PLT entry
[007] R_386_JMP_SLOT 0x0804D4B4 sym[009] : XSetClipMask => Create PLT entry
[008] R_386_JMP_SLOT 0x0804D4B8 sym[010] : XSetFont => Create PLT entry
[009] R_386_JMP_SLOT 0x0804D4BC sym[011] : XpmCreatePixmapFromData => Create PLT entry
[010] R_386_JMP_SLOT 0x0804D4C0 sym[012] : XSetFillStyle => Create PLT entry
[011] R_386_JMP_SLOT 0x0804D4C4 sym[013] : __libc_start_main => Create PLT entry
[012] R_386_JMP_SLOT 0x0804D4C8 sym[014] : XCreateSimpleWindow => Create PLT entry
[013] R_386_JMP_SLOT 0x0804D4CC sym[015] : XAutoRepeatOn => Create PLT entry
[014] R_386_JMP_SLOT 0x0804D4D0 sym[016] : XOpenDisplay => Create PLT entry
[015] R_386_JMP_SLOT 0x0804D4D4 sym[017] : gettimeofday => Create PLT entry
[016] R_386_JMP_SLOT 0x0804D4D8 sym[018] : XDrawLine => Create PLT entry
[017] R_386_JMP_SLOT 0x0804D4DC sym[019] : XCloseDisplay => Create PLT entry
[018] R_386_JMP_SLOT 0x0804D4E0 sym[020] : XSetForeground => Create PLT entry
[019] R_386_JMP_SLOT 0x0804D4E4 sym[021] : XFillRectangle => Create PLT entry
[020] R_386_JMP_SLOT 0x0804D4E8 sym[022] : fclose => Create PLT entry
[021] R_386_JMP_SLOT 0x0804D4EC sym[023] : XFreeGC => Create PLT entry
[022] R_386_JMP_SLOT 0x0804D4F0 sym[024] : XDrawRectangle => Create PLT entry
[023] R_386_JMP_SLOT 0x0804D4F4 sym[025] : fopen => Create PLT entry
[024] R_386_JMP_SLOT 0x0804D4F8 sym[026] : XNextEvent => Create PLT entry
[025] R_386_JMP_SLOT 0x0804D4FC sym[027] : XMapWindow => Create PLT entry
[026] R_386_JMP_SLOT 0x0804D500 sym[028] : _Znwj => Create PLT entry
[027] R_386_JMP_SLOT 0x0804D504 sym[029] : select => Create PLT entry
[028] R_386_JMP_SLOT 0x0804D508 sym[030] : XCreateGC => Create PLT entry
[029] R_386_JMP_SLOT 0x0804D50C sym[031] : fwrite => Create PLT entry
[030] R_386_JMP_SLOT 0x0804D510 sym[032] : XSelectInput => Create PLT entry
[031] R_386_JMP_SLOT 0x0804D514 sym[033] : XFlush => Create PLT entry
[032] R_386_JMP_SLOT 0x0804D518 sym[034] : XTextWidth => Create PLT entry
[033] R_386_JMP_SLOT 0x0804D51C sym[035] : XChangeGC => Create PLT entry
[034] R_386_JMP_SLOT 0x0804D520 sym[036] : XCopyColormapAndFree => Create PLT entry
[035] R_386_JMP_SLOT 0x0804D524 sym[037] : XLoadQueryFont => Create PLT entry
[036] R_386_JMP_SLOT 0x0804D528 sym[038] : XParseColor => Create PLT entry
[037] R_386_JMP_SLOT 0x0804D52C sym[039] : XAllocColor => Create PLT entry
[038] R_386_JMP_SLOT 0x0804D530 sym[040] : puts => Create PLT entry
[039] R_386_JMP_SLOT 0x0804D534 sym[041] : XSetStandardProperties => Create PLT entry
[040] R_386_JMP_SLOT 0x0804D538 sym[042] : XFreePixmap => Create PLT entry
[041] R_386_JMP_SLOT 0x0804D53C sym[043] : fread => Create PLT entry
[042] R_386_JMP_SLOT 0x0804D540 sym[044] : XCreatePixmap => Create PLT entry
[043] R_386_JMP_SLOT 0x0804D544 sym[055] : __gxx_personality_v0 => Create PLT entry
[044] R_386_JMP_SLOT 0x0804D548 sym[045] : _Unwind_Resume => Create PLT entry
[045] R_386_JMP_SLOT 0x0804D54C sym[046] : XSetWindowColormap => Create PLT entry
[046] R_386_JMP_SLOT 0x0804D550 sym[047] : XPending => Create PLT entry
Conviene fijarse en algunas funciones como: sprintf, fopen, fread, fclose…
En un post anterior vimos que el ejecutable busca un fichero desde el que leer el serial number, así que
saber dónde se hace un fopen/fread/fclose es sumamente interesante 😉
Ahora que tenemos unas pequeñas ayudas con las direcciones de esas funciones, y sabemos dónde poner
el primer punto de ruptura, podemos empezar a depurar con GDB:
Sigue leyendo HackIt! Nivel 10: solución detallada