Ayuda con ollydbg

Iniciado por majerisa, 18 Octubre 2016, 23:09 PM

0 Miembros y 1 Visitante están viendo este tema.

majerisa

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

apuromafo CLS

 00401393           75 0A          JNZ SHORT pac1.0040139F

a
00401393         JMP  004013EC

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


majerisa

Muchísimas gracias, podríais comentarme que hace el cambio que me comentáis?

BloodSharp

Cita de: apuromafo en 18 Octubre 2016, 23:34 PM
00401393           75 0A          JNZ SHORT pac1.0040139F

a
00401393         JMP  004013EC
Cita de: 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!

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 (asm) [Seleccionar]
00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código (asm) [Seleccionar]
call 004013E6


B#



majerisa

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??

BloodSharp

Cita de: 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??

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#



majerisa

#7
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

Cita de: BloodSharp en 19 Octubre 2016, 07:36 AM
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 (asm) [Seleccionar]
00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código (asm) [Seleccionar]
call 004013E6


B#


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



Cita de: BloodSharp en 19 Octubre 2016, 07:40 AM
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.

Cita de: majerisa en 19 Octubre 2016, 07:42 AM
Ya veo, entonces no puedo usar esa solución, tiene que pasar por la función passwordOK().

MOD: No hacer triple post.

MCKSys Argentina

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


$-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.

Cita de: BloodSharp en 19 Octubre 2016, 07:36 AM
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 (asm) [Seleccionar]
00401393           75 0A          JNZ SHORT pac1.0040139F
por
Código (asm) [Seleccionar]
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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


BloodSharp

#9
Cita de: MCKSys Argentina en 19 Octubre 2016, 17:30 PM
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 (asm) [Seleccionar]
00401340 <testcode.sub_401340>       | 55                       | push ebp                                |
00401341                             | 89 E5                    | mov ebp,esp                             |
00401343                             | 83 E4 F0                 | and esp,FFFFFFF0                        |
00401346                             | 83 EC 20                 | sub esp,20                              |
00401349                             | E8 72 06 00 00           | call testcode.4019C0                    |
0040134E                             | C7 44 24 1C 00 00 00 00  | mov dword ptr ss:[esp+1C],0             |
00401356                             | C7 44 24 18 00 00 00 00  | mov dword ptr ss:[esp+18],0             |
0040135E                             | EB 4B                    | jmp testcode.4013AB                     |
00401360                             | 83 44 24 18 01           | add dword ptr ss:[esp+18],1             |
00401365                             | C7 04 24 24 30 40 00     | mov dword ptr ss:[esp],testcode.403024  | 403024:"Password: "
0040136C                             | E8 BF 08 00 00           | call <testcode.printf>                  |
00401371                             | 8D 44 24 14              | lea eax,dword ptr ss:[esp+14]           |
00401375                             | 89 04 24                 | mov dword ptr ss:[esp],eax              |
00401378                             | E8 BB 08 00 00           | call <testcode.gets>                    |
0040137D                             | C7 44 24 04 2F 30 40 00  | mov dword ptr ss:[esp+4],testcode.40302 | 40302F:"PARIS"
00401385                             | 8D 44 24 14              | lea eax,dword ptr ss:[esp+14]           |
00401389                             | 89 04 24                 | mov dword ptr ss:[esp],eax              |
0040138C                             | E8 AF 08 00 00           | call <testcode.strcmp>                  |
00401391                             | 85 C0                    | test eax,eax                            |
00401393                             | 75 0A                    | jne testcode.40139F                     |
00401395                             | C7 44 24 1C 01 00 00 00  | mov dword ptr ss:[esp+1C],1             |
0040139D                             | EB 0C                    | jmp testcode.4013AB                     |
0040139F                             | C7 04 24 35 30 40 00     | mov dword ptr ss:[esp],testcode.403035  | 403035:"Password NOT OK"
004013A6                             | E8 9D 08 00 00           | call <testcode.puts>                    |
004013AB                             | 83 7C 24 1C 00           | cmp dword ptr ss:[esp+1C],0             |
004013B0                             | 75 07                    | jne testcode.4013B9                     |
004013B2                             | 83 7C 24 18 02           | cmp dword ptr ss:[esp+18],2             |
004013B7                             | 7E A7                    | jle testcode.401360                     |
004013B9                             | 83 7C 24 1C 01           | cmp dword ptr ss:[esp+1C],1             |
004013BE                             | 75 07                    | jne testcode.4013C7                     |
004013C0                             | E8 21 00 00 00           | call <testcode.sub_4013E6>              |
004013C5                             | EB 18                    | jmp testcode.4013DF                     |
004013C7                             | C7 04 24 45 30 40 00     | mov dword ptr ss:[esp],testcode.403045  | 403045:"ERROR: 3 passwords NOT OK"
004013CE                             | E8 75 08 00 00           | call <testcode.puts>                    |
004013D3                             | C7 04 24 5F 30 40 00     | mov dword ptr ss:[esp],testcode.40305F  | 40305F:"PAUSE"
004013DA                             | E8 71 08 00 00           | call <testcode.system>                  |
004013DF                             | B8 00 00 00 00           | mov eax,0                               |
004013E4                             | C9                       | leave                                   |
004013E5                             | C3                       | ret                                     |
004013E6 <testcode.sub_4013E6>       | 55                       | push ebp                                |
004013E7                             | 89 E5                    | mov ebp,esp                             |
004013E9                             | 83 EC 18                 | sub esp,18                              |
004013EC                             | C7 04 24 65 30 40 00     | mov dword ptr ss:[esp],testcode.403065  | 403065:"Password OK\n "
004013F3                             | E8 38 08 00 00           | call <testcode.printf>                  |
004013F8                             | C7 04 24 5F 30 40 00     | mov dword ptr ss:[esp],testcode.40305F  | 40305F:"PAUSE"
004013FF                             | E8 4C 08 00 00           | call <testcode.system>                  |
00401404                             | C9                       | leave                                   |
00401405                             | C3                       | ret                                     |



B#