2016-09-16 2 views
2

Je reçois le code ASM suivant à partir d'un simple programme C obfusqué qui m'a été attribué.Modifier les instructions asm dans un binaire ELF

0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax 
    0x00000000004006a4 <+151>: mov %rdx,%rsi 
    0x00000000004006a7 <+154>: mov %rax,%rdi 
    0x00000000004006aa <+157>: callq 0x400713 <SECRET> <====== 
    0x00000000004006af <+162>: movl $0x0,-0x24(%rbp) 
    0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203> 
    0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax 

L'objectif est de trouver et enlever qui provoque une erreur de segmentation fonction (patcher le binaire du programme). J'ai trouvé quelle fonction est à l'origine du segfault, mais je ne sais pas comment corriger le binaire.

Mon problème est de savoir comment le patch

0x00000000004006aa <+157>: callq 0x400713 <SECRET> 

pour que je l'appelle habitude la fonction SECRET.

Si j'utilise gdb pour ignorer/sauter SECRET en modifiant le compteur de programme tout en effectuant un seul pas à l'exécution, le programme termine l'exécution et me donne la sortie que je veux.

Ce que je veux est une copie modifiée en permanence du fichier binaire exécutable qui saute toujours sans utiliser de débogueur.

+0

est-il un moyen de l'ignorer ou de sauter que lorsque j'exécute le programme sans gdb –

+0

Sauter dans GDB ne compte pas comme résoudre votre affectation, mais oui, gdb peut sauter où vous voulez. Vérifiez le manuel de gdb. Vous pouvez même écraser l'instruction 'call' avec des NOP pendant cette session de débogage. Si c'est quelque chose comme une assignation de bombe-laboratoire binaire, vous êtes censé lui donner une entrée différente afin que l'exécution n'atteigne jamais ce bloc. –

+0

Oui, je peux le faire avec le compteur de programme, mais je cherche un moyen de modifier le binaire et supprimer cet appel de fonction et enregistrer le fichier corrigé. –

Répondre

1

J'étais curieux de savoir ce que je pouvais faire d'autre avec GDB. J'ai réussi à changer l'assemblage avec GDB et le programme corrigé fonctionne comme il se doit.

J'ai essayé d'utiliser nop mais cela n'a pas fonctionné alors j'ai regardé pour sauter la fonction. Comment fonctionne mon patch est:

(gdb) set {unsigned char *}0x4006aa = 0xEB 
(gdb) set {unsigned char *}0x4006ab = 0x0C 

Je fais est un saut court. L'opcode de saut court est EB XX où XX est le saut relatif de l'IP/PC. Donc, dans ce cas, je dois sauter 12 octets, aussi l'instruction est de 2 octets, donc je l'écris dans des emplacements mémoire consécutifs. J'écris le nouveau binaire modifié sur le disque dur et tout est génial.

Il m'a fallu une journée d'expérimentation mais à la fin j'ai beaucoup appris. : D

+1

Vous pourriez probablement faire 'set {unsigned short *} 0x4006aa = 0x0CEB' ainsi que –

+1

Comme c'était la première fois que je faisais quelque chose comme ça, je l'ai fait étape par étape. –