web-dev-qa-db-fra.com

Comment démonter la fonction principale d'une application dénudée?

Disons que j'ai compilé l'application ci-dessous et ont dépouillé ses symboles.

#include <stdio.h>

int main()
{
    printf("Hello\n");
}

Procédure de construction:

gcc -o hello hello.c
strip --strip-unneeded hello

Si l'application n'était pas dépouillée, la désassemblage de la fonction principale serait facile. Cependant, je ne sais pas comment démonter le Main fonction d'une application dépouillée.

(gdb) disas main
No symbol table is loaded.  Use the "file" command.

(gdb) info line main
Function "main" not defined.

Comment pourrais-je le faire? Est-ce même possible?

Notes: Cela doit être fait avec GDB uniquement. Oublier objdump . Supposons que je n'ai pas accès au code.

Un exemple pas à pas serait grandement apprécié.

33
karlphillip

Que diriez-vous de faire info files Pour obtenir la liste de section (avec adresses) et partir de là?

Exemple:

gdb) info files

Symbols from "/home/bob/tmp/t".
Local exec file:
`/home/bob/tmp/t', file type elf64-x86-64.
Entry point: 0x400490
0x0000000000400270 - 0x000000000040028c is .interp
0x000000000040028c - 0x00000000004002ac is .note.ABI-tag
    ....

0x0000000000400448 - 0x0000000000400460 is .init
    ....

Le désassemblable .init:

(gdb) disas 0x0000000000400448,0x0000000000400460
Dump of assembler code from 0x400448 to 0x400460:
   0x0000000000400448:  sub    $0x8,%rsp
   0x000000000040044c:  callq  0x4004bc
   0x0000000000400451:  callq  0x400550
   0x0000000000400456:  callq  0x400650
   0x000000000040045b:  add    $0x8,%rsp
   0x000000000040045f:  retq   

Ensuite, allez-y et démontez le reste.

Si j'étais vous, et j'avais la même version du GCC que votre exécutable a été construite avec, j'examinerais la séquence des fonctions appelées sur un exécutable factice non dépouillé. La séquence des appels est probablement similaire dans les cas les plus habituels, de sorte que cela pourrait vous aider à broyer la séquence de démarrage jusqu'à votre main par comparaison. Les optimisations vont probablement venir dans la voie cependant.

Si votre binaire est dépouillé et optimisé, main pourrait ne pas exister comme une "entité" dans le binaire; Les chances sont que vous ne pouvez pas obtenir beaucoup mieux que ce type de procédure.

8
Mat

Il y a un nouveau nouvel outil gratuit appelé Senstrip à partir du projet Paradyn (Divulgation complète: je travaille sur ce projet) qui réécrirea votre programme binaire, en ajoutant des informations de symboles et récupérera tout (ou presque toutes) des fonctions des fichiers binaires elfe dépouillés Pour vous, avec une grande précision. Cela n'identifiera pas la fonction principale comme "principale", mais il le trouvera et vous pouvez appliquer la heuristique que vous avez déjà mentionnée ci-dessus pour déterminer quelle fonction est principale.

http://www.paradyn.org/html/tools/untrip.html

Je suis désolé que ce n'est pas une solution uniquement du GDB.

1
Kevin