2017-09-28 6 views
0

Alors Heres la phase:Comment BufferOverflow cette phase pour la bombe binaire

0x00000000004013d9 <+0>:  sub $0x2c8,%rsp     #reserve 0x2c8 in stack 
0x00000000004013e0 <+7>:  mov %rdi,%rsi     #rsi = rdi 
0x00000000004013e3 <+10>: movw $0x6cb,0x42(%rsp)   #stack pointer + 0x42 = 0x6cb 
0x00000000004013ea <+17>: movw $0xcc26,0x50(%rsp)   # " 
0x00000000004013f1 <+24>: movw $0x8a1,0x44(%rsp)   # " 
0x00000000004013f8 <+31>: movb $0x7,0x40(%rsp)    # " 
0x00000000004013fd <+36>: movl $0x12fad68e,0x3c(%rsp)  # " 
0x0000000000401405 <+44>: movq $0x0,0x48(%rsp)    #same as above with corresponding values 
0x000000000040140e <+53>: lea 0x30(%rsp),%rdi    #rdi = value at 0x30 in stack 
0x0000000000401413 <+58>: callq 0x400ca0 <[email protected]>  #string copy 
0x0000000000401418 <+63>: movzbl 0x40(%rsp),%eax    #eax = value at 0x40 in stack 
0x000000000040141d <+68>: cmp $0x57,%al     #compare lower 8 bits of eax to 0x57 
0x000000000040141f <+70>: je  0x401426 <phase_4+77>  #continue if same 
0x0000000000401421 <+72>: callq 0x401bbe <bomb_ignition> 
0x0000000000401426 <+77>: movzwl 0x50(%rsp),%eax    #eax = value at 0x50 in stack 
0x000000000040142b <+82>: cmp $0xcc26,%ax     #compare lower 16 bits of eax to 0xcc26 
0x000000000040142f <+86>: je  0x401436 <phase_4+93>  #continue if same 
0x0000000000401431 <+88>: callq 0x401bbe <bomb_ignition> 
0x0000000000401436 <+93>: mov 0x48(%rsp),%rax    #rax = value at 0x48 in stack 
0x000000000040143b <+98>: test %rax,%rax     #rax = rax & rax 
0x000000000040143e <+101>: je  0x401445 <phase_4+108>  #continue if same 
0x0000000000401440 <+103>: callq 0x401bbe <bomb_ignition> 
0x0000000000401445 <+108>: movzwl 0x42(%rsp),%eax    #eax = value at 0x42 in stack 
0x000000000040144a <+113>: cmp $0x425b,%ax     #compare lower 16 bits of eax to 0x425b 
0x000000000040144e <+117>: je  0x401455 <phase_4+124>  #continue if same 
0x0000000000401450 <+119>: callq 0x401bbe <bomb_ignition> 
0x0000000000401455 <+124>: movzwl 0x44(%rsp),%edx    #edx = value at 0x44 in stack 
0x000000000040145a <+129>: mov 0x3c(%rsp),%eax    #eax = value at 0x3c in stack 
0x000000000040145e <+133>: shl $0x5,%eax     #eax *= 32 
0x0000000000401461 <+136>: movswl %dx,%edx     #edx = lower 16 bits of rdx 
0x0000000000401464 <+139>: xor %edx,%eax     #eax ^= edx 
0x0000000000401466 <+141>: cmp $0x2e8ee3c5,%eax   #compare eax a 0x2e8ee3c5 
0x000000000040146b <+146>: sete %al 
0x000000000040146e <+149>: movzbl %al,%eax 
0x0000000000401471 <+152>: add $0x2c8,%rsp      
0x0000000000401478 <+159>: retq 

Ive annotés ce que je pense faire son côté, mais je ne peux pas comprendre la grande image.

Je suppose qu'il prend l'entrée et la compare à ce qu'il met dans la pile? Je ne suis pas sûr du strcpy et où il copie à. Je suppose que c'est le registre rax/eax. Parce qu'il compare ensuite les valeurs dans la pile à cela. Mais je ne sais toujours pas comment comprendre ce que l'entrée est supposée être. J'ai essayé de mettre certaines des valeurs mov s dans la pile, comme 0x6cb, 0x8a1 et 0x7, dans et hexadécimal en convertisseur ASCII, mais les caractères de valeurs qu'ils produisent ne peuvent pas être mis en entrée, car certains sont emojis et d'autres choses. L'indice "dr evil" donnait "aller avec le flow, buffer overflow" donc je suis sûr que son bufferoverflowing.

Id apprécient toute aide. Je vous remercie.

+2

"Je ne suis pas sûr de la strcpy et où elle copie." Vous devriez regarder la convention d'appel d'agner (http://www.agner.org/optimize/calling_conventions.pdf) doc. La section 7 comporte une table qui montre quels registres sont utilisés pour les paramètres de divers systèmes d'exploitation. –

+0

Notez également que certaines valeurs vérifiées sont déjà dans la pile et que certaines doivent être remplacées par une valeur différente. – Jester

Répondre

1

D'une manière très simple, vous pouvez:
1- regard sur la fonction strcpy (man strcpy)

char * strcpy (char * destination, const char * source); 

2- regard à la convention d'appel (Dans votre cas, il devrait être un fichier 64bit linux)

Paramètres dans les registres sont RDI, RSI, RDX, RCX, R8, R9, XMM0–7
Puis:

> strcpy(RDI, RSI) 

3- Démarrez le débogueur et définir un point d'arrêt à cette adresse 0x0000000000401413 puis regarder le contenu du registre RDI et RSI avec la commande i r $rdi $rsi

Si vous avez le contrôle des valeurs à l'adresse de $rsi, vous pouvez écraser les valeurs à l'adresse $rdi