Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: majerisa en 18 Octubre 2016, 23:09 pm



Título: Ayuda con ollydbg
Publicado por: majerisa en 18 Octubre 2016, 23:09 pm
Hola a todos, estoy empezando en esto y estoy intentando hacer una practica y debo ser muy torpe porque no hay manera.
Tengo un programa que lo único que hace es comparar un password que se introduce por teclado y compararlo con el que tiene el código.
#include <stdlib.h>
int main()
{
    char password[4];
    int isOK = 0;
    int i =0;
    void passwordOK();
    while  (isOK == 0 && i<3){
        i++;
        printf("Password: ");
        gets(password);
        if (strcmp(password, "PARIS")==0)  {
        }   isOK = 1;
else{printf("Password NOT OK\n");
} };
    if (isOK ==1){
            passwordOK();
        }else{
            printf("ERROR: 3 passwords NOT
OK\n");
            system("PAUSE");
} }return 0;
void passwordOK()
{
     printf("Password OK\n ");
     system("PAUSE");
}


Lo que necesito hacer es, modificacarlo con ollydbg, de forma que si se introduzco una contraseña incorrecta, se realice igualmente la llamada a la función passwordOK() y muestre el mensaje "Password OK ".

Importante que haga la llamada a la función, y no consigo localizarla en el ensamblador que me da ollydbg. Pongo la parte que creo que es la importante....


$-8C     00401360        |> 834424 18 01   /ADD DWORD PTR SS:[ESP+18],1             ; |||
$-87     00401365        |. C70424 2430400>|MOV DWORD PTR SS:[ESP],pac1.00403024    ; |||ASCII "Password: "
$-80     0040136C        |. E8 BF080000    |CALL <JMP.&msvcrt.printf>               ; ||\printf
$-7B     00401371        |. 8D4424 14      |LEA EAX,DWORD PTR SS:[ESP+14]           ; ||
$-77     00401375        |. 890424         |MOV DWORD PTR SS:[ESP],EAX              ; ||
$-74     00401378        |. E8 BB080000    |CALL <JMP.&msvcrt.gets>                 ; |\gets
$-6F     0040137D        |. C74424 04 2F30>|MOV DWORD PTR SS:[ESP+4],pac1.0040302F  ; |ASCII "PARIS"
$-67     00401385        |. 8D4424 14      |LEA EAX,DWORD PTR SS:[ESP+14]           ; |
$-63     00401389        |. 890424         |MOV DWORD PTR SS:[ESP],EAX              ; |
$-60     0040138C        |. E8 AF080000    |CALL <JMP.&msvcrt.strcmp>               ; \strcmp
$-5B     00401391           85C0           TEST EAX,EAX
$-59     00401393           75 0A          JNZ SHORT pac1.0040139F
$-57     00401395           C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1
$-4F     0040139D        |. EB 0C          |JMP SHORT pac1.004013AB
$-4D     0040139F        |> C70424 3530400>|MOV DWORD PTR SS:[ESP],pac1.00403035    ; |ASCII "Password NOT OK"
$-46     004013A6        |. E8 9D080000    |CALL <JMP.&msvcrt.puts>                 ; \puts
$-41     004013AB        |> 837C24 1C 00    CMP DWORD PTR SS:[ESP+1C],0
$-3C     004013B0        |. 75 07          |JNZ SHORT pac1.004013B9
$-3A     004013B2        |. 837C24 18 02   |CMP DWORD PTR SS:[ESP+18],2
$-35     004013B7        |.^7E A7          \JLE SHORT pac1.00401360
$-33     004013B9        |> 837C24 1C 01   CMP DWORD PTR SS:[ESP+1C],1
$-2E     004013BE        |. 75 07          JNZ SHORT pac1.004013C7
$-2C     004013C0        |. E8 21000000    CALL pac1.004013E6
$-27     004013C5        |. EB 18          JMP SHORT pac1.004013DF
$-25     004013C7        |> C70424 4530400>MOV DWORD PTR SS:[ESP],pac1.00403045     ; ||ASCII "ERROR: 3 passwords NOT OK"
$-1E     004013CE        |. E8 75080000    CALL <JMP.&msvcrt.puts>                  ; |\puts
$-19     004013D3        |. C70424 5F30400>MOV DWORD PTR SS:[ESP],pac1.0040305F     ; |ASCII "PAUSE"
$-12     004013DA        |. E8 71080000    CALL <JMP.&msvcrt.system>                ; \system
$-D      004013DF        |> B8 00000000    MOV EAX,0
$-8      004013E4        |. C9             LEAVE
$-7      004013E5        \. C3             RETN
$-6      004013E6        /$ 55             PUSH EBP
$-5      004013E7        |. 89E5           MOV EBP,ESP
$-3      004013E9        |. 83EC 18        SUB ESP,18
$ ==>    004013EC           C70424 6530400>MOV DWORD PTR SS:[ESP],pac1.00403065     ;  ASCII "Password OK
 "



Muchas gracias por vuestra ayuda


Título: Re: Ayuda con ollydbg
Publicado por: apuromafo CLS en 18 Octubre 2016, 23:34 pm
 00401393           75 0A          JNZ SHORT pac1.0040139F

a
 00401393         JMP  004013EC


Título: Re: Ayuda con ollydbg
Publicado por: MCKSys Argentina en 18 Octubre 2016, 23:37 pm
Hola!

Como ha colocado apuromafo, si modificas el salto de 00401393 para que salte siempre (cambiar el JNZ por JMP), aceptará cualquier password (incluída la correcta).

Saludos!


Título: Re: Ayuda con ollydbg
Publicado por: majerisa en 19 Octubre 2016, 07:05 am
Muchísimas gracias, podríais comentarme que hace el cambio que me comentáis?


Título: Re: Ayuda con ollydbg
Publicado por: BloodSharp en 19 Octubre 2016, 07:36 am
00401393           75 0A          JNZ SHORT pac1.0040139F

a
 00401393         JMP  004013EC
Hola!

Como ha colocado apuromafo, si modificas el salto de 00401393 para que salte siempre (cambiar el JNZ por JMP), aceptará cualquier password (incluída la correcta).

Saludos!

En mi preferencia a ese código hay que tener cuidado... sobre todo porque se salta directo ahí al printf de otra función y la stack es distinta aparentemente y cuando el caller apunte a cualquier lado puff...

yo reemplazaría ahí
Código
  1. 00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código
  1. call 004013E6


B#


Título: Re: Ayuda con ollydbg
Publicado por: majerisa en 19 Octubre 2016, 07:36 am
Imagino que estoy equivocado pero mirando bien lo que me me comentáis me da la impresión que si lo cambio a
 00401393         JMP  004013EC lo que hace es mostrar por pantalla el ok pero no ejecuta la función que comentaba, no??


Título: Re: Ayuda con ollydbg
Publicado por: BloodSharp en 19 Octubre 2016, 07:40 am
Imagino que estoy equivocado pero mirando bien lo que me me comentáis me da la impresión que si lo cambio a
 00401393         JMP  004013EC lo que hace es mostrar por pantalla el ok pero no ejecuta la función que comentaba, no??

Salta directamente al printf de la otra función y mostrara password correcta, pero estoy casi seguro que va a fallar el programa cuando llegue a una instrucción ret


B#


Título: Re: Ayuda con ollydbg
Publicado por: majerisa en 19 Octubre 2016, 07:40 am
Ahora le echaré un vistazo a lo que me comentas, el requisito es que tiene que seguir pasando por la función  passwordOK(), no vale solo con importante imprimir por pantalla el ok directamente.

Saludos y muchas gracias por tu aportación

En mi preferencia a ese código hay que tener cuidado... sobre todo porque se salta directo ahí al printf de otra función y la stack es distinta aparentemente y cuando el caller apunte a cualquier lado puff...

yo reemplazaría ahí
Código
  1. 00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código
  1. call 004013E6


B#

Ya veo, entonces no puedo usar esa solución, tiene que pasar por la función passwordOK().



Salta directamente al printf de la otra función y mostrara password correcta, pero estoy casi seguro que va a fallar el programa cuando llegue a una instrucción ret


B#

Una pregunta, y con la opción que tú propones que hace?. No entiendo muy bien que haría.

Ya veo, entonces no puedo usar esa solución, tiene que pasar por la función passwordOK().

MOD: No hacer triple post.


Título: Re: Ayuda con ollydbg
Publicado por: MCKSys Argentina en 19 Octubre 2016, 17:30 pm
Revisando con más detenimiento el código, veo que si pones un JMP en 00401393 no vas a lograr lo que quieres. (errar es humano  :P)

Lo que podrías hacer es NOPear esa instrucción para que

Código:
$-57     00401395           C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1

se ejecute. Con eso haces que el "flag de igualdad" que usa el proggie se active y pase los chequeos siguientes.

En mi preferencia a ese código hay que tener cuidado... sobre todo porque se salta directo ahí al printf de otra función y la stack es distinta aparentemente y cuando el caller apunte a cualquier lado puff...

yo reemplazaría ahí
Código
  1. 00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código
  1. call 004013E6


B#

Revisa el código. Saltar a ése printf en particular no rompe nada pues no PUSHea nada al stack, lo usa directamente.
Ahora, si usas un CALL como pones, ahí sí romperás el stack y tendrás una excepción.

Saludos!


Título: Re: Ayuda con ollydbg
Publicado por: BloodSharp en 20 Octubre 2016, 01:51 am
Revisa el código. Saltar a ése printf en particular no rompe nada pues no PUSHea nada al stack, lo usa directamente.
Ahora, si usas un CALL como pones, ahí sí romperás el stack y tendrás una excepción.

Saludos!

Si cierto, mala mía :P ahí revisé bien el código y efectivamentelo el caller se va a cualquier lado.
Poniendo el call igual muestra el mensaje pero cuando termina la rutina passwordOK explota, además que el call es más largo que el jmp short :S (5bytes vs 2bytes).
Lo compilé en mingw (sin optimizaciones) y quedó identico...
Dejo las rutinas completas:

Código
  1. 00401340 <testcode.sub_401340>       | 55                       | push ebp                                |
  2. 00401341                             | 89 E5                    | mov ebp,esp                             |
  3. 00401343                             | 83 E4 F0                 | and esp,FFFFFFF0                        |
  4. 00401346                             | 83 EC 20                 | sub esp,20                              |
  5. 00401349                             | E8 72 06 00 00           | call testcode.4019C0                    |
  6. 0040134E                             | C7 44 24 1C 00 00 00 00  | mov dword ptr ss:[esp+1C],0             |
  7. 00401356                             | C7 44 24 18 00 00 00 00  | mov dword ptr ss:[esp+18],0             |
  8. 0040135E                             | EB 4B                    | jmp testcode.4013AB                     |
  9. 00401360                             | 83 44 24 18 01           | add dword ptr ss:[esp+18],1             |
  10. 00401365                             | C7 04 24 24 30 40 00     | mov dword ptr ss:[esp],testcode.403024  | 403024:"Password: "
  11. 0040136C                             | E8 BF 08 00 00           | call <testcode.printf>                  |
  12. 00401371                             | 8D 44 24 14              | lea eax,dword ptr ss:[esp+14]           |
  13. 00401375                             | 89 04 24                 | mov dword ptr ss:[esp],eax              |
  14. 00401378                             | E8 BB 08 00 00           | call <testcode.gets>                    |
  15. 0040137D                             | C7 44 24 04 2F 30 40 00  | mov dword ptr ss:[esp+4],testcode.40302 | 40302F:"PARIS"
  16. 00401385                             | 8D 44 24 14              | lea eax,dword ptr ss:[esp+14]           |
  17. 00401389                             | 89 04 24                 | mov dword ptr ss:[esp],eax              |
  18. 0040138C                             | E8 AF 08 00 00           | call <testcode.strcmp>                  |
  19. 00401391                             | 85 C0                    | test eax,eax                            |
  20. 00401393                             | 75 0A                    | jne testcode.40139F                     |
  21. 00401395                             | C7 44 24 1C 01 00 00 00  | mov dword ptr ss:[esp+1C],1             |
  22. 0040139D                             | EB 0C                    | jmp testcode.4013AB                     |
  23. 0040139F                             | C7 04 24 35 30 40 00     | mov dword ptr ss:[esp],testcode.403035  | 403035:"Password NOT OK"
  24. 004013A6                             | E8 9D 08 00 00           | call <testcode.puts>                    |
  25. 004013AB                             | 83 7C 24 1C 00           | cmp dword ptr ss:[esp+1C],0             |
  26. 004013B0                             | 75 07                    | jne testcode.4013B9                     |
  27. 004013B2                             | 83 7C 24 18 02           | cmp dword ptr ss:[esp+18],2             |
  28. 004013B7                             | 7E A7                    | jle testcode.401360                     |
  29. 004013B9                             | 83 7C 24 1C 01           | cmp dword ptr ss:[esp+1C],1             |
  30. 004013BE                             | 75 07                    | jne testcode.4013C7                     |
  31. 004013C0                             | E8 21 00 00 00           | call <testcode.sub_4013E6>              |
  32. 004013C5                             | EB 18                    | jmp testcode.4013DF                     |
  33. 004013C7                             | C7 04 24 45 30 40 00     | mov dword ptr ss:[esp],testcode.403045  | 403045:"ERROR: 3 passwords NOT OK"
  34. 004013CE                             | E8 75 08 00 00           | call <testcode.puts>                    |
  35. 004013D3                             | C7 04 24 5F 30 40 00     | mov dword ptr ss:[esp],testcode.40305F  | 40305F:"PAUSE"
  36. 004013DA                             | E8 71 08 00 00           | call <testcode.system>                  |
  37. 004013DF                             | B8 00 00 00 00           | mov eax,0                               |
  38. 004013E4                             | C9                       | leave                                   |
  39. 004013E5                             | C3                       | ret                                     |
  40. 004013E6 <testcode.sub_4013E6>       | 55                       | push ebp                                |
  41. 004013E7                             | 89 E5                    | mov ebp,esp                             |
  42. 004013E9                             | 83 EC 18                 | sub esp,18                              |
  43. 004013EC                             | C7 04 24 65 30 40 00     | mov dword ptr ss:[esp],testcode.403065  | 403065:"Password OK\n "
  44. 004013F3                             | E8 38 08 00 00           | call <testcode.printf>                  |
  45. 004013F8                             | C7 04 24 5F 30 40 00     | mov dword ptr ss:[esp],testcode.40305F  | 40305F:"PAUSE"
  46. 004013FF                             | E8 4C 08 00 00           | call <testcode.system>                  |
  47. 00401404                             | C9                       | leave                                   |
  48. 00401405                             | C3                       | ret                                     |


B#


Título: Re: Ayuda con ollydbg
Publicado por: majerisa en 20 Octubre 2016, 09:55 am
Muchas gracias por vuestras aportaciones, estoy intentando leer algo y entender vuestras explicaciones, soy un poco profano en la materia.

BloodSharp, si no he entendido mal la solución del CALL no sería viable enotnces?

MCKSys, la solucion que me comentas de activar el flag para que pase la igualdad (entiendo que  la idea es hacer que esta igualdad siempre se cumple (strcmp(password, "PARIS")==0)) me parece buena idea, lo que no entiendo es como "NOPear esa instrucción".


Nuevamente muchas gracias por vuestra ayuda de verdad



Título: Re: Ayuda con ollydbg
Publicado por: BloodSharp en 20 Octubre 2016, 13:32 pm
(...)BloodSharp, si no he entendido mal la solución del CALL no sería viable enotnces?(...)
Para este caso no... en otras situaciones capaz que si...

(...)MCKSys, la solucion que me comentas de activar el flag para que pase la igualdad (entiendo que  la idea es hacer que esta igualdad siempre se cumple (strcmp(password, "PARIS")==0)) me parece buena idea, lo que no entiendo es como "NOPear esa instrucción".(...)

Lo que él te sugiere sería equivalente a hacer algo como esto:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void passwordOK();
  6.  
  7. int main()
  8. {
  9. char password[4];
  10. int isOK = 0;
  11. int i =0;
  12. while(isOK == 0 && i<3)
  13. {
  14. i++;
  15. printf("Password: ");
  16. gets(password);
  17. strcmp(password, "PARIS");
  18. isOK = 1;
  19. };
  20. if (isOK ==1)
  21. {
  22. passwordOK();
  23. }
  24. else
  25. {
  26. printf("ERROR: 3 passwords NOT OK\n");
  27. system("PAUSE");
  28. }
  29. return 0;
  30. }
  31.  
  32. __declspec(noinline)void passwordOK()
  33. {
  34.     printf("Password OK\n ");
  35.     system("PAUSE");
  36. }

...pero solo modificando el ejecutable así:

Link de imagen (http://i.imgur.com/uE5riRM.png)

(http://i.imgur.com/uE5riRM.png)


B#



Título: Re: Ayuda con ollydbg
Publicado por: majerisa en 20 Octubre 2016, 20:57 pm
Muchísimas gracias por tu explicación.